Skip to content

Commit ddcae04

Browse files
committed
Do not invoke [Map|Collection].isEmpty() in nullSafeConciseToString()
gh-30811 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 <util:set />, <util:list />, and <util:map /> 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-31156
1 parent 994bbec commit ddcae04

File tree

2 files changed

+12
-14
lines changed

2 files changed

+12
-14
lines changed

spring-core/src/main/java/org/springframework/util/ObjectUtils.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public abstract class ObjectUtils {
7070
private static final String ARRAY_ELEMENT_SEPARATOR = ", ";
7171
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
7272
private static final String NON_EMPTY_ARRAY = ARRAY_START + "..." + ARRAY_END;
73-
private static final String EMPTY_COLLECTION = "[]";
74-
private static final String NON_EMPTY_COLLECTION = "[...]";
73+
private static final String COLLECTION = "[...]";
74+
private static final String MAP = NON_EMPTY_ARRAY;
7575

7676

7777
/**
@@ -938,10 +938,9 @@ public static String nullSafeToString(@Nullable short[] array) {
938938
* <li>{@code"Optional[<concise-string>]"} if {@code obj} is a non-empty {@code Optional},
939939
* where {@code <concise-string>} is the result of invoking {@link #nullSafeConciseToString}
940940
* on the object contained in the {@code Optional}</li>
941-
* <li>{@code "{}"} if {@code obj} is an empty array or {@link Map}</li>
942-
* <li>{@code "{...}"} if {@code obj} is a non-empty array or {@link Map}</li>
943-
* <li>{@code "[]"} if {@code obj} is an empty {@link Collection}</li>
944-
* <li>{@code "[...]"} if {@code obj} is a non-empty {@link Collection}</li>
941+
* <li>{@code "{}"} if {@code obj} is an empty array</li>
942+
* <li>{@code "{...}"} if {@code obj} is a {@link Map} or a non-empty array</li>
943+
* <li>{@code "[...]"} if {@code obj} is a {@link Collection}</li>
945944
* <li>{@linkplain Class#getName() Class name} if {@code obj} is a {@link Class}</li>
946945
* <li>{@linkplain Charset#name() Charset name} if {@code obj} is a {@link Charset}</li>
947946
* <li>{@linkplain TimeZone#getID() TimeZone ID} if {@code obj} is a {@link TimeZone}</li>
@@ -977,12 +976,11 @@ public static String nullSafeConciseToString(@Nullable Object obj) {
977976
if (obj.getClass().isArray()) {
978977
return (Array.getLength(obj) == 0 ? EMPTY_ARRAY : NON_EMPTY_ARRAY);
979978
}
980-
if (obj instanceof Collection<?>) {
981-
return (((Collection<?>) obj).isEmpty() ? EMPTY_COLLECTION : NON_EMPTY_COLLECTION);
979+
if (obj instanceof Collection) {
980+
return COLLECTION;
982981
}
983-
if (obj instanceof Map<?, ?>) {
984-
// EMPTY_ARRAY and NON_EMPTY_ARRAY are also used for maps.
985-
return (((Map<?, ?>) obj).isEmpty() ? EMPTY_ARRAY : NON_EMPTY_ARRAY);
982+
if (obj instanceof Map) {
983+
return MAP;
986984
}
987985
if (obj instanceof Class<?>) {
988986
return ((Class<?>) obj).getName();

spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,8 +1078,8 @@ void nullSafeConciseToStringForNonEmptyArrays() {
10781078
void nullSafeConciseToStringForEmptyCollections() {
10791079
List<String> list = Collections.emptyList();
10801080
Set<Integer> set = Collections.emptySet();
1081-
assertThat(ObjectUtils.nullSafeConciseToString(list)).isEqualTo("[]");
1082-
assertThat(ObjectUtils.nullSafeConciseToString(set)).isEqualTo("[]");
1081+
assertThat(ObjectUtils.nullSafeConciseToString(list)).isEqualTo("[...]");
1082+
assertThat(ObjectUtils.nullSafeConciseToString(set)).isEqualTo("[...]");
10831083
}
10841084

10851085
@Test
@@ -1094,7 +1094,7 @@ void nullSafeConciseToStringForNonEmptyCollections() {
10941094
@Test
10951095
void nullSafeConciseToStringForEmptyMaps() {
10961096
Map<String, Object> map = Collections.emptyMap();
1097-
assertThat(ObjectUtils.nullSafeConciseToString(map)).isEqualTo("{}");
1097+
assertThat(ObjectUtils.nullSafeConciseToString(map)).isEqualTo("{...}");
10981098
}
10991099

11001100
@Test

0 commit comments

Comments
 (0)