From 7d7e8ef7fb3b631edffd7b98ddb12814c181d3b5 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Tue, 24 May 2011 19:40:14 +0000 Subject: [PATCH] SPR-6749 git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4360 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../support/GenericConversionService.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) 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); + } } }