diff --git a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java index 0faabf6ec8b..30763e66ace 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java +++ b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java @@ -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 { 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 diff --git a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java index 446f0f9193f..19880892917 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java @@ -627,13 +627,35 @@ public class DefaultConversionServiceTests { assertEquals(3, result[2]); } + @Test + public void convertListOfNonStringifiable() { + List 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 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 list1 = Arrays.asList("Foo", "Bar"); List list2 = Arrays.asList("Baz", "Boop"); List> 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); }