From aef1460a64628739146a0b91df708933931d0a60 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 12 Dec 2016 22:28:48 +0100 Subject: [PATCH] TypeDescriptor properly narrows ResolvableType for non-typed collection elements Issue: SPR-14971 --- .../core/convert/TypeDescriptor.java | 7 ++++-- .../DefaultConversionServiceTests.java | 24 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) 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 3be68ba39c9..eb74d51b780 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 @@ -186,7 +186,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()); } /** @@ -435,7 +435,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 36b44091d9e..8d1048301cf 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 @@ -628,13 +628,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); }