Skip to content

Commit aef1460

Browse files
committed
TypeDescriptor properly narrows ResolvableType for non-typed collection elements
Issue: SPR-14971
1 parent 8b5ee4e commit aef1460

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public TypeDescriptor narrow(Object value) {
186186
return this;
187187
}
188188
ResolvableType narrowed = ResolvableType.forType(value.getClass(), getResolvableType());
189-
return new TypeDescriptor(narrowed, null, getAnnotations());
189+
return new TypeDescriptor(narrowed, value.getClass(), getAnnotations());
190190
}
191191

192192
/**
@@ -435,7 +435,10 @@ private TypeDescriptor narrow(Object value, TypeDescriptor typeDescriptor) {
435435
if (typeDescriptor != null) {
436436
return typeDescriptor.narrow(value);
437437
}
438-
return (value != null ? new TypeDescriptor(getResolvableType(), value.getClass(), getAnnotations()) : null);
438+
if (value != null) {
439+
return narrow(value);
440+
}
441+
return null;
439442
}
440443

441444
@Override

spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -628,13 +628,35 @@ public void convertArrayToArrayAssignable() {
628628
assertEquals(3, result[2]);
629629
}
630630

631+
@Test
632+
public void convertListOfNonStringifiable() {
633+
List<Object> list = Arrays.asList(new TestEntity(1L), new TestEntity(2L));
634+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
635+
try {
636+
conversionService.convert(list, String.class);
637+
}
638+
catch (ConversionFailedException ex) {
639+
assertTrue(ex.getMessage().contains(list.getClass().getName()));
640+
assertTrue(ex.getCause() instanceof ConverterNotFoundException);
641+
assertTrue(ex.getCause().getMessage().contains(TestEntity.class.getName()));
642+
}
643+
}
644+
645+
@Test
646+
public void convertListOfStringToString() {
647+
List<String> list = Arrays.asList("Foo", "Bar");
648+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
649+
String result = conversionService.convert(list, String.class);
650+
assertEquals("Foo,Bar", result);
651+
}
652+
631653
@Test
632654
public void convertListOfListToString() {
633655
List<String> list1 = Arrays.asList("Foo", "Bar");
634656
List<String> list2 = Arrays.asList("Baz", "Boop");
635657
List<List<String>> list = Arrays.asList(list1, list2);
658+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
636659
String result = conversionService.convert(list, String.class);
637-
assertNotNull(result);
638660
assertEquals("Foo,Bar,Baz,Boop", result);
639661
}
640662

0 commit comments

Comments
 (0)