Browse Source

TypeDescriptor properly narrows ResolvableType for non-typed collection elements

Issue: SPR-14971
(cherry picked from commit aef1460)
pull/1290/head
Juergen Hoeller 9 years ago
parent
commit
442d8a68a6
  1. 7
      spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java
  2. 24
      spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java

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

@ -190,7 +190,7 @@ public class TypeDescriptor implements Serializable { @@ -190,7 +190,7 @@ public class TypeDescriptor implements Serializable {
return this;
}
ResolvableType narrowed = ResolvableType.forType(value.getClass(), getResolvableType());
return new TypeDescriptor(narrowed, null, getAnnotations());
return new TypeDescriptor(narrowed, value.getClass(), getAnnotations());
}
/**
@ -439,7 +439,10 @@ public class TypeDescriptor implements Serializable { @@ -439,7 +439,10 @@ public class TypeDescriptor implements Serializable {
if (typeDescriptor != null) {
return typeDescriptor.narrow(value);
}
return (value != null ? new TypeDescriptor(getResolvableType(), value.getClass(), getAnnotations()) : null);
if (value != null) {
return narrow(value);
}
return null;
}
@Override

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

@ -627,13 +627,35 @@ public class DefaultConversionServiceTests { @@ -627,13 +627,35 @@ public class DefaultConversionServiceTests {
assertEquals(3, result[2]);
}
@Test
public void convertListOfNonStringifiable() {
List<Object> list = Arrays.asList(new TestEntity(1L), new TestEntity(2L));
assertTrue(conversionService.canConvert(list.getClass(), String.class));
try {
conversionService.convert(list, String.class);
}
catch (ConversionFailedException ex) {
assertTrue(ex.getMessage().contains(list.getClass().getName()));
assertTrue(ex.getCause() instanceof ConverterNotFoundException);
assertTrue(ex.getCause().getMessage().contains(TestEntity.class.getName()));
}
}
@Test
public void convertListOfStringToString() {
List<String> list = Arrays.asList("Foo", "Bar");
assertTrue(conversionService.canConvert(list.getClass(), String.class));
String result = conversionService.convert(list, String.class);
assertEquals("Foo,Bar", result);
}
@Test
public void convertListOfListToString() {
List<String> list1 = Arrays.asList("Foo", "Bar");
List<String> list2 = Arrays.asList("Baz", "Boop");
List<List<String>> list = Arrays.asList(list1, list2);
assertTrue(conversionService.canConvert(list.getClass(), String.class));
String result = conversionService.convert(list, String.class);
assertNotNull(result);
assertEquals("Foo,Bar,Baz,Boop", result);
}

Loading…
Cancel
Save