fixed failing tests due to generic object to object converter fallback being over eager

This commit is contained in:
Keith Donald
2009-11-12 06:57:51 +00:00
parent c58378603a
commit 70fe75384d
8 changed files with 75 additions and 57 deletions

View File

@@ -40,6 +40,8 @@ public class DefaultConversionService extends GenericConversionService {
addConverterFactory(String.class, Enum.class, new StringToEnumConverterFactory());
addConverterFactory(Number.class, Number.class, new NumberToNumberConverterFactory());
addConverterFactory(Character.class, Number.class, new CharacterToNumberFactory());
addConverter(Object.class, String.class, new ObjectToStringConverter());
addGenericConverter(Object.class, Object.class, new ObjectToObjectGenericConverter());
}
}

View File

@@ -81,8 +81,6 @@ public class GenericConversionService implements ConversionService, ConverterReg
addGenericConverter(Object.class, Object[].class, new ObjectToArrayConverter(this));
addGenericConverter(Object.class, Collection.class, new ObjectToCollectionConverter(this));
addGenericConverter(Object.class, Map.class, new ObjectToMapConverter(this));
addConverter(Object.class, String.class, new ObjectToStringConverter());
addGenericConverter(Object.class, Object.class, new ObjectToObjectGenericConverter());
}
/**

View File

@@ -34,7 +34,13 @@ import org.springframework.util.ReflectionUtils;
* @author Keith Donald
* @since 3.0
*/
final class ObjectToObjectGenericConverter implements GenericConverter {
final class ObjectToObjectGenericConverter implements ConditionalGenericConverter {
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
Class<?> sourceClass = sourceType.getObjectType();
Class<?> targetClass = targetType.getObjectType();
return getValueOfMethodOn(targetClass, sourceClass) != null || getConstructor(targetClass, sourceClass) != null;
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
if (sourceType.isAssignableTo(targetType)) {
@@ -43,11 +49,11 @@ final class ObjectToObjectGenericConverter implements GenericConverter {
Class<?> sourceClass = sourceType.getObjectType();
Class<?> targetClass = targetType.getObjectType();
Object target;
Method method = ClassUtils.getStaticMethod(targetClass, "valueOf", sourceClass);
Method method = getValueOfMethodOn(targetClass, sourceClass);
if (method != null) {
target = ReflectionUtils.invokeMethod(method, null, source);
} else {
Constructor<?> constructor = ClassUtils.getConstructorIfAvailable(targetClass, sourceClass);
Constructor<?> constructor = getConstructor(targetClass, sourceClass);
if (constructor != null) {
try {
target = constructor.newInstance(source);
@@ -67,4 +73,13 @@ final class ObjectToObjectGenericConverter implements GenericConverter {
}
return target;
}
}
private Method getValueOfMethodOn(Class<?> targetClass, Class<?> argType) {
return ClassUtils.getStaticMethod(targetClass, "valueOf", argType);
}
private Constructor<?> getConstructor(Class<?> targetClass, Class<?> sourceClass) {
return ClassUtils.getConstructorIfAvailable(targetClass, sourceClass);
}
}