diff --git a/spring-context/src/main/java/org/springframework/context/expression/MapAccessor.java b/spring-context/src/main/java/org/springframework/context/expression/MapAccessor.java index 97ecdc5855..e02ae8ac7e 100644 --- a/spring-context/src/main/java/org/springframework/context/expression/MapAccessor.java +++ b/spring-context/src/main/java/org/springframework/context/expression/MapAccessor.java @@ -81,7 +81,7 @@ public class MapAccessor implements CompilablePropertyAccessor { @Override public boolean canWrite(EvaluationContext context, @Nullable Object target, String name) throws AccessException { - return this.allowWrite; + return (this.allowWrite && target instanceof Map); } @Override diff --git a/spring-context/src/test/java/org/springframework/context/expression/MapAccessorTests.java b/spring-context/src/test/java/org/springframework/context/expression/MapAccessorTests.java index a82b2e75c6..d867b569f1 100644 --- a/spring-context/src/test/java/org/springframework/context/expression/MapAccessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/expression/MapAccessorTests.java @@ -81,6 +81,22 @@ class MapAccessorTests { assertThat(ex.getValue(sec, testMap)).isEqualTo("bar2"); } + @Test + void canWrite() throws Exception { + StandardEvaluationContext context = new StandardEvaluationContext(); + Map testMap = getSimpleTestMap(); + + MapAccessor mapAccessor = new MapAccessor(); + assertThat(mapAccessor.canWrite(context, new Object(), "foo")).isFalse(); + assertThat(mapAccessor.canWrite(context, testMap, "foo")).isTrue(); + // Cannot actually write to an immutable Map, but MapAccessor cannot easily check for that. + assertThat(mapAccessor.canWrite(context, Map.of(), "x")).isTrue(); + + mapAccessor = new MapAccessor(false); + assertThat(mapAccessor.canWrite(context, new Object(), "foo")).isFalse(); + assertThat(mapAccessor.canWrite(context, testMap, "foo")).isFalse(); + } + @Test void isWritable() { Map testMap = getSimpleTestMap();