Change GenericConversionService to better handle enum
Prior to this commit, given an enum which implements some interface, GenericConversionService would select the String -> Enum converter even if a converter for String -> SomeInterface was registered. This also affected converters that were registered for String -> SomeBaseInterface, when SomeInterface extended SomeBaseInterface. This change modifies the behavior of the private method getClassHierarchy() by placing Enum.class as late as possible, pretty much the same way as Object.class is handled. Issue: SPR-12050
This commit is contained in:
committed by
Stephane Nicoll
parent
ebc5fea77b
commit
d0e6f0f73f
@@ -55,6 +55,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Juergen Hoeller
|
||||
* @author Chris Beams
|
||||
* @author Phillip Webb
|
||||
* @author David Haraburda
|
||||
* @since 3.0
|
||||
*/
|
||||
public class GenericConversionService implements ConfigurableConversionService {
|
||||
@@ -567,19 +568,31 @@ 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) {
|
||||
if (candidate.getSuperclass() != null && superclass != Object.class && superclass != Enum.class) {
|
||||
addToClassHierarchy(i + 1, candidate.getSuperclass(), array, hierarchy, visited);
|
||||
}
|
||||
for (Class<?> implementedInterface : candidate.getInterfaces()) {
|
||||
addToClassHierarchy(hierarchy.size(), implementedInterface, array, hierarchy, visited);
|
||||
}
|
||||
addInterfacesToClassHierarchy(candidate, array, hierarchy, visited);
|
||||
i++;
|
||||
}
|
||||
|
||||
if (type.isEnum()) {
|
||||
addToClassHierarchy(hierarchy.size(), Enum.class, array, hierarchy, visited);
|
||||
addToClassHierarchy(hierarchy.size(), Enum.class, false, hierarchy, visited);
|
||||
addInterfacesToClassHierarchy(Enum.class, array, hierarchy, visited);
|
||||
}
|
||||
|
||||
addToClassHierarchy(hierarchy.size(), Object.class, array, hierarchy, visited);
|
||||
addToClassHierarchy(hierarchy.size(), Object.class, false, hierarchy, visited);
|
||||
return hierarchy;
|
||||
}
|
||||
|
||||
private void addInterfacesToClassHierarchy(Class<?> type, boolean asArray,
|
||||
List<Class<?>> hierarchy, Set<Class<?>> visited) {
|
||||
for (Class<?> implementedInterface : type.getInterfaces()) {
|
||||
addToClassHierarchy(hierarchy.size(), implementedInterface, asArray, hierarchy, visited);
|
||||
}
|
||||
}
|
||||
|
||||
private void addToClassHierarchy(int index, Class<?> type, boolean asArray,
|
||||
List<Class<?>> hierarchy, Set<Class<?>> visited) {
|
||||
if (asArray) {
|
||||
|
||||
Reference in New Issue
Block a user