Propagate RelaxedConversionService

Prior to this commit, the internal BeanWrapper used by the
RelaxedDataBinder was not using any conversion service at all. This
commit makes sure to propagate the one that has been configured
internally.

Also a dummy call to a [foo] key seems to have been left and has
been removed. This allows to support Enum as map key.

Fixes gh-1242
This commit is contained in:
Stephane Nicoll 2014-07-13 07:54:51 +02:00 committed by Dave Syer
parent 9372d15433
commit 76729fdf85
2 changed files with 35 additions and 3 deletions

View File

@ -28,6 +28,7 @@ import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.InvalidPropertyException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.util.StringUtils;
import org.springframework.validation.DataBinder;
@ -47,6 +48,8 @@ public class RelaxedDataBinder extends DataBinder {
private boolean ignoreNestedProperties;
private ConversionService relaxedConversionService;
/**
* Create a new {@link RelaxedDataBinder} instance.
* @param target the target into which properties are bound
@ -76,12 +79,19 @@ public class RelaxedDataBinder extends DataBinder {
this.ignoreNestedProperties = ignoreNestedProperties;
}
@Override
public void setConversionService(ConversionService conversionService) {
super.setConversionService(conversionService);
this.relaxedConversionService = new RelaxedConversionService(getConversionService());
}
@Override
public void initBeanPropertyAccess() {
super.initBeanPropertyAccess();
this.relaxedConversionService = (this.relaxedConversionService != null
? this.relaxedConversionService : new RelaxedConversionService(getConversionService()));
// Hook in the RelaxedConversionService
getInternalBindingResult().initConversion(
new RelaxedConversionService(getConversionService()));
getInternalBindingResult().initConversion(relaxedConversionService);
}
@Override
@ -111,6 +121,7 @@ public class RelaxedDataBinder extends DataBinder {
}
BeanWrapper targetWrapper = new BeanWrapperImpl(target);
targetWrapper.setConversionService(this.relaxedConversionService);
targetWrapper.setAutoGrowNestedPaths(true);
List<PropertyValue> list = propertyValues.getPropertyValueList();
@ -189,7 +200,6 @@ public class RelaxedDataBinder extends DataBinder {
TypeDescriptor descriptor = wrapper.getPropertyTypeDescriptor(name);
if (descriptor == null || descriptor.isMap()) {
if (descriptor != null) {
wrapper.getPropertyValue(name + "[foo]");
TypeDescriptor valueDescriptor = descriptor.getMapValueTypeDescriptor();
if (valueDescriptor != null) {
Class<?> valueType = valueDescriptor.getObjectType();

View File

@ -284,6 +284,15 @@ public class RelaxedDataBinderTests {
assertEquals("123", target.getNested().get("value.foo"));
}
@Test
public void testBindNestedMapOfEnum() throws Exception {
this.conversionService = new DefaultConversionService();
TargetWithNestedMapOfEnum target = new TargetWithNestedMapOfEnum();
bind(target, "nested.this: bar\n" + "nested.ThAt: 123");
assertEquals("bar", target.getNested().get(Bingo.THIS));
assertEquals("123", target.getNested().get(Bingo.THAT));
}
@Test
public void testBindNestedMapBracketReferenced() throws Exception {
TargetWithNestedMap target = new TargetWithNestedMap();
@ -578,6 +587,19 @@ public class RelaxedDataBinderTests {
}
public static class TargetWithNestedMapOfEnum {
private Map<Bingo, Object> nested;
public Map<Bingo, Object> getNested() {
return nested;
}
public void setNested(Map<Bingo, Object> nested) {
this.nested = nested;
}
}
public static class TargetWithNestedMapOfListOfString {
private Map<String, List<String>> nested;