diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessor.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessor.java index 2737970f2..576ab3d8a 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessor.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessor.java @@ -95,7 +95,7 @@ public class XWorkMapPropertyAccessor extends MapPropertyAccessor { result = map.get(key); if (result == null && - context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null + Boolean.TRUE.equals(context.get(ReflectionContextState.CREATE_NULL_OBJECTS)) && objectTypeDeterminer.shouldCreateIfNew(lastClass,lastProperty,target,null,false)) { Class valueClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, key); diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessorTest.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessorTest.java new file mode 100644 index 000000000..a746c7e77 --- /dev/null +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkMapPropertyAccessorTest.java @@ -0,0 +1,54 @@ +package com.opensymphony.xwork2.ognl.accessor; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.util.Element; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.reflection.ReflectionContextState; + +import java.util.Collections; +import java.util.Map; + +public class XWorkMapPropertyAccessorTest extends XWorkTestCase { + public void testCreateNullObjectsIsFalseByDefault() { + ValueStack vs = ActionContext.getContext().getValueStack(); + vs.push(new MapHolder(Collections.emptyMap())); + assertNull(vs.findValue("map[key]")); + } + + public void testMapContentsAreReturned() { + ValueStack vs = ActionContext.getContext().getValueStack(); + vs.push(new MapHolder(Collections.singletonMap("key", "value"))); + assertEquals("value", vs.findValue("map['key']")); + } + + public void testNullIsNotReturnedWhenCreateNullObjectsIsSpecified() { + ValueStack vs = ActionContext.getContext().getValueStack(); + vs.push(new MapHolder(Collections.emptyMap())); + ReflectionContextState.setCreatingNullObjects(vs.getContext(), true); + + Object value = vs.findValue("map['key']"); + assertNotNull(value); + assertSame(Object.class, value.getClass()); + } + + public void testNullIsReturnedWhenCreateNullObjectsIsSpecifiedAsFalse() { + ValueStack vs = ActionContext.getContext().getValueStack(); + vs.push(new MapHolder(Collections.emptyMap())); + ReflectionContextState.setCreatingNullObjects(vs.getContext(), false); + assertNull(vs.findValue("map['key']")); + } + + private static class MapHolder { + private final Map map; + + public MapHolder(Map m) { + this.map = m; + } + + @Element(value = Object.class) + public Map getMap() { + return map; + } + } +}