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:
parent
9372d15433
commit
76729fdf85
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue