Commit 76729fdf authored by Stephane Nicoll's avatar Stephane Nicoll Committed by Dave Syer

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
parent 9372d154
......@@ -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();
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment