Skip to content

Commit bcdda91

Browse files
committed
TypeDescriptor properly narrows ResolvableType for non-typed collection elements
Issue: SPR-14971 (cherry picked from commit 442d8a6)
1 parent 2de488e commit bcdda91

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public TypeDescriptor narrow(Object value) {
191191
return this;
192192
}
193193
ResolvableType narrowed = ResolvableType.forType(value.getClass(), this.resolvableType);
194-
return new TypeDescriptor(narrowed, null, this.annotations);
194+
return new TypeDescriptor(narrowed, value.getClass(), this.annotations);
195195
}
196196

197197
/**
@@ -445,7 +445,10 @@ private TypeDescriptor narrow(Object value, TypeDescriptor typeDescriptor) {
445445
if (typeDescriptor != null) {
446446
return typeDescriptor.narrow(value);
447447
}
448-
return (value != null ? new TypeDescriptor(this.resolvableType, value.getClass(), this.annotations) : null);
448+
if (value != null) {
449+
return narrow(value);
450+
}
451+
return null;
449452
}
450453

451454
@Override

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,13 +608,35 @@ public void convertArrayToArrayAssignable() {
608608
assertEquals(3, result[2]);
609609
}
610610

611+
@Test
612+
public void convertListOfNonStringifiable() {
613+
List<Object> list = Arrays.asList(new TestEntity(1L), new TestEntity(2L));
614+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
615+
try {
616+
conversionService.convert(list, String.class);
617+
}
618+
catch (ConversionFailedException ex) {
619+
assertTrue(ex.getMessage().contains(list.getClass().getName()));
620+
assertTrue(ex.getCause() instanceof ConverterNotFoundException);
621+
assertTrue(ex.getCause().getMessage().contains(TestEntity.class.getName()));
622+
}
623+
}
624+
625+
@Test
626+
public void convertListOfStringToString() {
627+
List<String> list = Arrays.asList("Foo", "Bar");
628+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
629+
String result = conversionService.convert(list, String.class);
630+
assertEquals("Foo,Bar", result);
631+
}
632+
611633
@Test
612634
public void convertListOfListToString() {
613635
List<String> list1 = Arrays.asList("Foo", "Bar");
614636
List<String> list2 = Arrays.asList("Baz", "Boop");
615637
List<List<String>> list = Arrays.asList(list1, list2);
638+
assertTrue(conversionService.canConvert(list.getClass(), String.class));
616639
String result = conversionService.convert(list, String.class);
617-
assertNotNull(result);
618640
assertEquals("Foo,Bar,Baz,Boop", result);
619641
}
620642

0 commit comments

Comments
 (0)