SPR-8718 Prevent ClassCastException when the target of Converter<?,?> is a super-class of the actual target.

This commit is contained in:
Rossen Stoyanchev 2011-09-26 12:30:38 +00:00
parent f6483cad3c
commit 1d7a6c53da
2 changed files with 29 additions and 10 deletions

View File

@ -485,7 +485,7 @@ public class GenericConversionService implements ConfigurableConversionService {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private final class ConverterAdapter implements GenericConverter { private final class ConverterAdapter implements ConditionalGenericConverter {
private final ConvertiblePair typeInfo; private final ConvertiblePair typeInfo;
@ -500,6 +500,11 @@ public class GenericConversionService implements ConfigurableConversionService {
return Collections.singleton(this.typeInfo); return Collections.singleton(this.typeInfo);
} }
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return (typeInfo.getTargetType().equals(targetType.getObjectType()) &&
typeInfo.getSourceType().isAssignableFrom(sourceType.getObjectType()));
}
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
if (source == null) { if (source == null) {
return convertNullSource(sourceType, targetType); return convertNullSource(sourceType, targetType);
@ -511,6 +516,7 @@ public class GenericConversionService implements ConfigurableConversionService {
return this.typeInfo.getSourceType().getName() + " -> " + this.typeInfo.getTargetType().getName() + return this.typeInfo.getSourceType().getName() + " -> " + this.typeInfo.getTargetType().getName() +
" : " + this.converter.toString(); " : " + this.converter.toString();
} }
} }

View File

@ -16,6 +16,16 @@
package org.springframework.core.convert.support; package org.springframework.core.convert.support;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.awt.Color;
import java.awt.SystemColor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -28,7 +38,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.ConverterNotFoundException; import org.springframework.core.convert.ConverterNotFoundException;
import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.TypeDescriptor;
@ -39,14 +48,6 @@ import org.springframework.core.io.Resource;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
/** /**
* @author Keith Donald * @author Keith Donald
* @author Juergen Hoeller * @author Juergen Hoeller
@ -205,6 +206,18 @@ public class GenericConversionServiceTests {
assertEquals(new Integer(3), result); assertEquals(new Integer(3), result);
} }
// SPR-8718
@Test(expected=ConverterNotFoundException.class)
public void convertSuperTarget() {
conversionService.addConverter(new ColorConverter());
conversionService.convert("#000000", SystemColor.class);
}
public class ColorConverter implements Converter<String, Color> {
public Color convert(String source) { if (!source.startsWith("#")) source = "#" + source; return Color.decode(source); }
}
@Test @Test
public void convertObjectToPrimitive() { public void convertObjectToPrimitive() {
assertFalse(conversionService.canConvert(String.class, boolean.class)); assertFalse(conversionService.canConvert(String.class, boolean.class));