Make Map<String,String> a special case in RelaxedDataBinder

Fixes gh-195
pull/208/head
Dave Syer 11 years ago
parent 7b58718453
commit 2066c04a3e

@ -187,6 +187,14 @@ public class RelaxedDataBinder extends DataBinder {
if (descriptor == null || descriptor.isMap()) {
if (descriptor != null) {
wrapper.getPropertyValue(name + "[foo]");
TypeDescriptor valueDescriptor = descriptor.getMapValueTypeDescriptor();
if (valueDescriptor != null) {
Class<?> valueType = valueDescriptor.getObjectType();
if (valueType != null
&& CharSequence.class.isAssignableFrom(valueType)) {
path.collapseKeys(index);
}
}
}
path.mapIndex(index);
extendMapIfNecessary(wrapper, path, index);
@ -278,6 +286,22 @@ public class RelaxedDataBinder extends DataBinder {
this.nodes = splitPath(path);
}
public void collapseKeys(int index) {
List<PathNode> revised = new ArrayList<PathNode>();
for (int i = 0; i < index; i++) {
revised.add(this.nodes.get(i));
}
StringBuilder builder = new StringBuilder();
for (int i = index; i < this.nodes.size(); i++) {
if (i > index) {
builder.append(".");
}
builder.append(this.nodes.get(i).name);
}
revised.add(new PropertyNode(builder.toString()));
this.nodes = revised;
}
public void mapIndex(int index) {
PathNode node = this.nodes.get(index);
if (node instanceof PropertyNode) {

@ -250,6 +250,14 @@ public class RelaxedDataBinderTests {
assertEquals("123", target.getNested().get("value"));
}
@Test
public void testBindNestedMapOfString() throws Exception {
TargetWithNestedMapOfString target = new TargetWithNestedMapOfString();
bind(target, "nested.foo: bar\n" + "nested.value.foo: 123");
assertEquals("bar", target.getNested().get("foo"));
assertEquals("123", target.getNested().get("value.foo"));
}
@Test
public void testBindNestedMapBracketReferenced() throws Exception {
TargetWithNestedMap target = new TargetWithNestedMap();
@ -469,6 +477,18 @@ public class RelaxedDataBinderTests {
}
}
public static class TargetWithNestedMapOfString {
private Map<String, String> nested;
public Map<String, String> getNested() {
return this.nested;
}
public void setNested(Map<String, String> nested) {
this.nested = nested;
}
}
public static class TargetWithNestedMapOfListOfString {
private Map<String, List<String>> nested;

@ -26,7 +26,6 @@ import javax.validation.constraints.NotNull;
import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@ -326,7 +325,6 @@ public class EnableConfigurationPropertiesTests {
}
@Test
@Ignore("This is challenging, so maybe not supportable?")
public void testBindingWithMapKeyWithPeriod() {
this.context.register(ResourceBindingPropertiesWithMap.class);
this.context.refresh();

Loading…
Cancel
Save