TypeDescriptor properly narrows ResolvableType for non-typed collection elements
Issue: SPR-14971
This commit is contained in:
parent
8b5ee4ef91
commit
aef1460a64
|
|
@ -186,7 +186,7 @@ public class TypeDescriptor implements Serializable {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
ResolvableType narrowed = ResolvableType.forType(value.getClass(), getResolvableType());
|
ResolvableType narrowed = ResolvableType.forType(value.getClass(), getResolvableType());
|
||||||
return new TypeDescriptor(narrowed, null, getAnnotations());
|
return new TypeDescriptor(narrowed, value.getClass(), getAnnotations());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -435,7 +435,10 @@ public class TypeDescriptor implements Serializable {
|
||||||
if (typeDescriptor != null) {
|
if (typeDescriptor != null) {
|
||||||
return typeDescriptor.narrow(value);
|
return typeDescriptor.narrow(value);
|
||||||
}
|
}
|
||||||
return (value != null ? new TypeDescriptor(getResolvableType(), value.getClass(), getAnnotations()) : null);
|
if (value != null) {
|
||||||
|
return narrow(value);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -628,13 +628,35 @@ public class DefaultConversionServiceTests {
|
||||||
assertEquals(3, result[2]);
|
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
|
@Test
|
||||||
public void convertListOfListToString() {
|
public void convertListOfListToString() {
|
||||||
List<String> list1 = Arrays.asList("Foo", "Bar");
|
List<String> list1 = Arrays.asList("Foo", "Bar");
|
||||||
List<String> list2 = Arrays.asList("Baz", "Boop");
|
List<String> list2 = Arrays.asList("Baz", "Boop");
|
||||||
List<List<String>> list = Arrays.asList(list1, list2);
|
List<List<String>> list = Arrays.asList(list1, list2);
|
||||||
|
assertTrue(conversionService.canConvert(list.getClass(), String.class));
|
||||||
String result = conversionService.convert(list, String.class);
|
String result = conversionService.convert(list, String.class);
|
||||||
assertNotNull(result);
|
|
||||||
assertEquals("Foo,Bar,Baz,Boop", result);
|
assertEquals("Foo,Bar,Baz,Boop", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue