From 9b2da37f7928b356b881df5b02777008a5d0caba Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 12 Sep 2014 17:23:51 +0200 Subject: [PATCH] GenericConversionService detects enum subclasses as well Issue: SPR-12181 --- .../support/GenericConversionService.java | 4 +-- .../GenericConversionServiceTests.java | 35 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java index 7ab8813a384..ca9ae9581f9 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java @@ -568,14 +568,14 @@ public class GenericConversionService implements ConfigurableConversionService { Class candidate = hierarchy.get(i); candidate = (array ? candidate.getComponentType() : ClassUtils.resolvePrimitiveIfNecessary(candidate)); Class superclass = candidate.getSuperclass(); - if (candidate.getSuperclass() != null && superclass != Object.class && superclass != Enum.class) { + if (superclass != null && superclass != Object.class && superclass != Enum.class) { addToClassHierarchy(i + 1, candidate.getSuperclass(), array, hierarchy, visited); } addInterfacesToClassHierarchy(candidate, array, hierarchy, visited); i++; } - if (type.isEnum()) { + if (Enum.class.isAssignableFrom(type)) { addToClassHierarchy(hierarchy.size(), Enum.class, array, hierarchy, visited); addToClassHierarchy(hierarchy.size(), Enum.class, false, hierarchy, visited); addInterfacesToClassHierarchy(Enum.class, array, hierarchy, visited); diff --git a/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java index bd88180631d..fca9caf6fbd 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java @@ -63,6 +63,7 @@ public class GenericConversionServiceTests { private GenericConversionService conversionService = new GenericConversionService(); + @Test public void canConvert() { assertFalse(conversionService.canConvert(String.class, Integer.class)); @@ -750,6 +751,13 @@ public class GenericConversionServiceTests { assertEquals("A", result); } + @Test + public void testSubclassOfEnumToString() throws Exception { + conversionService.addConverter(new EnumToStringConverter(conversionService)); + String result = conversionService.convert(EnumWithSubclass.FIRST, String.class); + assertEquals("FIRST", result); + } + @Test public void testEnumWithInterfaceToStringConversion() { // SPR-9692 @@ -865,6 +873,7 @@ public class GenericConversionServiceTests { @ExampleAnnotation public String annotatedString; + @Retention(RetentionPolicy.RUNTIME) public static @interface ExampleAnnotation { } @@ -907,8 +916,7 @@ public class GenericConversionServiceTests { } @Override - public Object convert(Object source, TypeDescriptor sourceType, - TypeDescriptor targetType) { + public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { return null; } @@ -945,14 +953,19 @@ public class GenericConversionServiceTests { } } + interface MyEnumBaseInterface { + String getBaseCode(); } + interface MyEnumInterface extends MyEnumBaseInterface { + String getCode(); } + public static enum MyEnum implements MyEnumInterface { A("1"), @@ -977,6 +990,17 @@ public class GenericConversionServiceTests { } + public enum EnumWithSubclass { + + FIRST { + @Override + public String toString() { + return "1st"; + } + } + } + + public static class MyStringToRawCollectionConverter implements Converter { @Override @@ -985,6 +1009,7 @@ public class GenericConversionServiceTests { } } + public static class MyStringToGenericCollectionConverter implements Converter> { @Override @@ -993,6 +1018,7 @@ public class GenericConversionServiceTests { } } + private static class MyEnumInterfaceToStringConverter implements Converter { @Override @@ -1001,6 +1027,7 @@ public class GenericConversionServiceTests { } } + private static class StringToMyEnumInterfaceConverterFactory implements ConverterFactory { @SuppressWarnings("unchecked") @@ -1024,9 +1051,9 @@ public class GenericConversionServiceTests { return null; } } - } + private static class StringToMyEnumBaseInterfaceConverterFactory implements ConverterFactory { @SuppressWarnings("unchecked") @@ -1050,7 +1077,6 @@ public class GenericConversionServiceTests { return null; } } - } @@ -1062,6 +1088,7 @@ public class GenericConversionServiceTests { } } + public static class MyStringToIntegerCollectionConverter implements Converter> { @Override