diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java b/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java index 8586b92cbe1..2645bfa2d51 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java @@ -352,6 +352,7 @@ public class GenericConversionService implements ConversionService, ConverterReg else { LinkedList> classQueue = new LinkedList>(); classQueue.addFirst(sourceObjectType); + LinkedList> attemptedInterfaces = new LinkedList>(); while (!classQueue.isEmpty()) { Class currentClass = classQueue.removeLast(); if (logger.isTraceEnabled()) { @@ -374,7 +375,7 @@ public class GenericConversionService implements ConversionService, ConverterReg else { Class[] interfaces = currentClass.getInterfaces(); for (Class ifc : interfaces) { - addInterfaceHierarchy(ifc, classQueue); + addInterfaceHierarchy(ifc, classQueue, attemptedInterfaces); } if (currentClass.getSuperclass() != null) { classQueue.addFirst(currentClass.getSuperclass()); @@ -395,7 +396,6 @@ public class GenericConversionService implements ConversionService, ConverterReg private GenericConverter getMatchingConverterForTarget(TypeDescriptor sourceType, TypeDescriptor targetType, Map, MatchableConverters> converters) { - Class targetObjectType = targetType.getObjectType(); if (targetObjectType.isInterface()) { LinkedList> classQueue = new LinkedList>(); @@ -423,6 +423,7 @@ public class GenericConversionService implements ConversionService, ConverterReg else { LinkedList> classQueue = new LinkedList>(); classQueue.addFirst(targetObjectType); + LinkedList> attemptedInterfaces = new LinkedList>(); while (!classQueue.isEmpty()) { Class currentClass = classQueue.removeLast(); if (logger.isTraceEnabled()) { @@ -445,7 +446,7 @@ public class GenericConversionService implements ConversionService, ConverterReg else { Class[] interfaces = currentClass.getInterfaces(); for (Class ifc : interfaces) { - addInterfaceHierarchy(ifc, classQueue); + addInterfaceHierarchy(ifc, classQueue, attemptedInterfaces); } if (currentClass.getSuperclass() != null) { classQueue.addFirst(currentClass.getSuperclass()); @@ -456,10 +457,13 @@ public class GenericConversionService implements ConversionService, ConverterReg } } - private void addInterfaceHierarchy(Class interfaceType, LinkedList> classQueue) { - classQueue.addFirst(interfaceType); - for (Class inheritedInterface : interfaceType.getInterfaces()) { - addInterfaceHierarchy(inheritedInterface, classQueue); + private void addInterfaceHierarchy(Class interfaceType, LinkedList> classQueue, LinkedList> attemptedInterfaces) { + if (!attemptedInterfaces.contains(interfaceType)) { + classQueue.addFirst(interfaceType); + attemptedInterfaces.add(interfaceType); + for (Class inheritedInterface : interfaceType.getInterfaces()) { + addInterfaceHierarchy(inheritedInterface, classQueue, attemptedInterfaces); + } } }