From bcdda917e738d75287e34eff24652f0239a7a16e 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 (cherry picked from commit 442d8a6) --- .../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 ec016f04f5..9134b50c0e 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 @@ -191,7 +191,7 @@ public class TypeDescriptor implements Serializable { return this; } ResolvableType narrowed = ResolvableType.forType(value.getClass(), this.resolvableType); - return new TypeDescriptor(narrowed, null, this.annotations); + return new TypeDescriptor(narrowed, value.getClass(), this.annotations); } /** @@ -445,7 +445,10 @@ public class TypeDescriptor implements Serializable { if (typeDescriptor != null) { return typeDescriptor.narrow(value); } - return (value != null ? new TypeDescriptor(this.resolvableType, value.getClass(), this.annotations) : null); + if (value != null) { + return narrow(value); + } + return null; } @Override diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java index 5059738cab..4feec099c8 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/support/DefaultConversionServiceTests.java @@ -608,13 +608,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); }