diff --git a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java index 7640ae573db..7717a21b932 100644 --- a/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java +++ b/org.springframework.expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java @@ -57,8 +57,15 @@ public class Indexer extends SpelNodeImpl { index = reference.getName(); indexValue = new TypedValue(index,CommonTypeDescriptors.STRING_TYPE_DESCRIPTOR); } else { - indexValue = children[0].getValueInternal(state); - index = indexValue.getValue(); + // In case the map key is unqualified, we want it evaluated against the root object so + // temporarily push that on whilst evaluating the key + try { + state.pushActiveContextObject(state.getRootContextObject()); + indexValue = children[0].getValueInternal(state); + index = indexValue.getValue(); + } finally { + state.popActiveContextObject(); + } } // Indexing into a Map diff --git a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java index 21a4c67f8e3..1524571ea0d 100644 --- a/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java +++ b/org.springframework.expression/src/test/java/org/springframework/expression/spel/SpringEL300Tests.java @@ -152,17 +152,35 @@ public class SpringEL300Tests extends ExpressionTestCase { name = expr.getValue(eContext,String.class); Assert.assertEquals("Dave",name); + // MapAccessor required for this to work expr = new SpelExpressionParser().parse("jdbcProperties.username"); eContext.addPropertyAccessor(new MapAccessor()); name = expr.getValue(eContext,String.class); Assert.assertEquals("Dave",name); + + // --- dotted property names + + // lookup foo on the root, then bar on that, then use that as the key into jdbcProperties + expr = new SpelExpressionParser().parse("jdbcProperties[foo.bar]"); + eContext.addPropertyAccessor(new MapAccessor()); + name = expr.getValue(eContext,String.class); + Assert.assertEquals("Dave2",name); + + // key is foo.bar + expr = new SpelExpressionParser().parse("jdbcProperties['foo.bar']"); + eContext.addPropertyAccessor(new MapAccessor()); + name = expr.getValue(eContext,String.class); + Assert.assertEquals("Elephant",name); } static class TestProperties { public Properties jdbcProperties = new Properties(); + public Properties foo = new Properties(); TestProperties() { jdbcProperties.put("username","Dave"); - jdbcProperties.put("foo.bar","Dave"); + jdbcProperties.put("alias","Dave2"); + jdbcProperties.put("foo.bar","Elephant"); + foo.put("bar","alias"); } }