From ea4105165119937d1da59704be053f4023d56a9c Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Fri, 8 Sep 2023 16:03:00 +0200 Subject: [PATCH] Do not invoke [Map|Collection].isEmpty() in nullSafeConciseToString() gh-30810 introduced explicit support for collections and maps in ObjectUtils.nullSafeConciseToString() by invoking isEmpty() on a Map or Collection to determine which concise string representation should be used. However, this caused a regression in which an exception was thrown if the Map or Collection was a proxy generated by AbstractFactoryBean to support , , and in XML configuration. This commit addresses this set of regressions by always returning "[...]" or "{...}" for a Collection or Map, respectively, disregarding whether the map is empty or not. Closes gh-31138 --- .../org/springframework/util/ObjectUtils.java | 18 ++++++++---------- .../springframework/util/ObjectUtilsTests.java | 8 ++++---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java index 38621f2f5d7..10822e3c257 100644 --- a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java @@ -70,7 +70,6 @@ public abstract class ObjectUtils { private static final String ARRAY_ELEMENT_SEPARATOR = ", "; private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; private static final String NON_EMPTY_ARRAY = ARRAY_START + "..." + ARRAY_END; - private static final String EMPTY_COLLECTION = "[]"; private static final String NON_EMPTY_COLLECTION = "[...]"; @@ -915,10 +914,9 @@ public abstract class ObjectUtils { *
  • {@code"Optional[]"} if {@code obj} is a non-empty {@code Optional}, * where {@code } is the result of invoking {@link #nullSafeConciseToString} * on the object contained in the {@code Optional}
  • - *
  • {@code "{}"} if {@code obj} is an empty array or {@link Map}
  • - *
  • {@code "{...}"} if {@code obj} is a non-empty array or {@link Map}
  • - *
  • {@code "[]"} if {@code obj} is an empty {@link Collection}
  • - *
  • {@code "[...]"} if {@code obj} is a non-empty {@link Collection}
  • + *
  • {@code "{}"} if {@code obj} is an empty array
  • + *
  • {@code "{...}"} if {@code obj} is a {@link Map} or a non-empty array
  • + *
  • {@code "[...]"} if {@code obj} is a {@link Collection}
  • *
  • {@linkplain Class#getName() Class name} if {@code obj} is a {@link Class}
  • *
  • {@linkplain Charset#name() Charset name} if {@code obj} is a {@link Charset}
  • *
  • {@linkplain TimeZone#getID() TimeZone ID} if {@code obj} is a {@link TimeZone}
  • @@ -953,12 +951,12 @@ public abstract class ObjectUtils { if (obj.getClass().isArray()) { return (Array.getLength(obj) == 0 ? EMPTY_ARRAY : NON_EMPTY_ARRAY); } - if (obj instanceof Collection collection) { - return (collection.isEmpty() ? EMPTY_COLLECTION : NON_EMPTY_COLLECTION); + if (obj instanceof Collection) { + return NON_EMPTY_COLLECTION; } - if (obj instanceof Map map) { - // EMPTY_ARRAY and NON_EMPTY_ARRAY are also used for maps. - return (map.isEmpty() ? EMPTY_ARRAY : NON_EMPTY_ARRAY); + if (obj instanceof Map) { + // NON_EMPTY_ARRAY is also used for maps. + return NON_EMPTY_ARRAY; } if (obj instanceof Class clazz) { return clazz.getName(); diff --git a/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java b/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java index e67f964c3b9..8090c4be82f 100644 --- a/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java @@ -1052,8 +1052,8 @@ class ObjectUtilsTests { void nullSafeConciseToStringForEmptyCollections() { List list = List.of(); Set set = Set.of(); - assertThat(ObjectUtils.nullSafeConciseToString(list)).isEqualTo("[]"); - assertThat(ObjectUtils.nullSafeConciseToString(set)).isEqualTo("[]"); + assertThat(ObjectUtils.nullSafeConciseToString(list)).isEqualTo("[...]"); + assertThat(ObjectUtils.nullSafeConciseToString(set)).isEqualTo("[...]"); } @Test @@ -1066,8 +1066,8 @@ class ObjectUtilsTests { @Test void nullSafeConciseToStringForEmptyMaps() { - Map map = new HashMap(); - assertThat(ObjectUtils.nullSafeConciseToString(map)).isEqualTo("{}"); + Map map = Map.of(); + assertThat(ObjectUtils.nullSafeConciseToString(map)).isEqualTo("{...}"); } @Test