Skip to content

Commit 76729fd

Browse files
snicollDave Syer
authored andcommitted
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
1 parent 9372d15 commit 76729fd

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.beans.InvalidPropertyException;
2929
import org.springframework.beans.MutablePropertyValues;
3030
import org.springframework.beans.PropertyValue;
31+
import org.springframework.core.convert.ConversionService;
3132
import org.springframework.core.convert.TypeDescriptor;
3233
import org.springframework.util.StringUtils;
3334
import org.springframework.validation.DataBinder;
@@ -47,6 +48,8 @@ public class RelaxedDataBinder extends DataBinder {
4748

4849
private boolean ignoreNestedProperties;
4950

51+
private ConversionService relaxedConversionService;
52+
5053
/**
5154
* Create a new {@link RelaxedDataBinder} instance.
5255
* @param target the target into which properties are bound
@@ -76,12 +79,19 @@ public void setIgnoreNestedProperties(boolean ignoreNestedProperties) {
7679
this.ignoreNestedProperties = ignoreNestedProperties;
7780
}
7881

82+
@Override
83+
public void setConversionService(ConversionService conversionService) {
84+
super.setConversionService(conversionService);
85+
this.relaxedConversionService = new RelaxedConversionService(getConversionService());
86+
}
87+
7988
@Override
8089
public void initBeanPropertyAccess() {
8190
super.initBeanPropertyAccess();
91+
this.relaxedConversionService = (this.relaxedConversionService != null
92+
? this.relaxedConversionService : new RelaxedConversionService(getConversionService()));
8293
// Hook in the RelaxedConversionService
83-
getInternalBindingResult().initConversion(
84-
new RelaxedConversionService(getConversionService()));
94+
getInternalBindingResult().initConversion(relaxedConversionService);
8595
}
8696

8797
@Override
@@ -111,6 +121,7 @@ private MutablePropertyValues modifyProperties(MutablePropertyValues propertyVal
111121
}
112122

113123
BeanWrapper targetWrapper = new BeanWrapperImpl(target);
124+
targetWrapper.setConversionService(this.relaxedConversionService);
114125
targetWrapper.setAutoGrowNestedPaths(true);
115126

116127
List<PropertyValue> list = propertyValues.getPropertyValueList();
@@ -189,7 +200,6 @@ private String initializePath(BeanWrapper wrapper, BeanPath path, int index) {
189200
TypeDescriptor descriptor = wrapper.getPropertyTypeDescriptor(name);
190201
if (descriptor == null || descriptor.isMap()) {
191202
if (descriptor != null) {
192-
wrapper.getPropertyValue(name + "[foo]");
193203
TypeDescriptor valueDescriptor = descriptor.getMapValueTypeDescriptor();
194204
if (valueDescriptor != null) {
195205
Class<?> valueType = valueDescriptor.getObjectType();

spring-boot/src/test/java/org/springframework/boot/bind/RelaxedDataBinderTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,15 @@ public void testBindNestedMapOfString() throws Exception {
284284
assertEquals("123", target.getNested().get("value.foo"));
285285
}
286286

287+
@Test
288+
public void testBindNestedMapOfEnum() throws Exception {
289+
this.conversionService = new DefaultConversionService();
290+
TargetWithNestedMapOfEnum target = new TargetWithNestedMapOfEnum();
291+
bind(target, "nested.this: bar\n" + "nested.ThAt: 123");
292+
assertEquals("bar", target.getNested().get(Bingo.THIS));
293+
assertEquals("123", target.getNested().get(Bingo.THAT));
294+
}
295+
287296
@Test
288297
public void testBindNestedMapBracketReferenced() throws Exception {
289298
TargetWithNestedMap target = new TargetWithNestedMap();
@@ -578,6 +587,19 @@ public void setNested(Map<String, String> nested) {
578587

579588
}
580589

590+
public static class TargetWithNestedMapOfEnum {
591+
592+
private Map<Bingo, Object> nested;
593+
594+
public Map<Bingo, Object> getNested() {
595+
return nested;
596+
}
597+
598+
public void setNested(Map<Bingo, Object> nested) {
599+
this.nested = nested;
600+
}
601+
}
602+
581603
public static class TargetWithNestedMapOfListOfString {
582604

583605
private Map<String, List<String>> nested;

0 commit comments

Comments
 (0)