From a0e43b1f4646c1583ebe447a0c56f59e8a4b49c9 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 17 Jul 2024 10:29:21 +0800 Subject: [PATCH 1/2] Add support for making MapAccessor read-only See gh-33222 --- .../context/expression/MapAccessor.java | 24 +++++++++++++++++-- .../context/expression/MapAccessorTests.java | 11 +++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) 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 e7374fe305f..b523d1a5455 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,10 +33,30 @@ import org.springframework.util.Assert; * * @author Juergen Hoeller * @author Andy Clement + * @author Yanming Zhou * @since 3.0 */ public class MapAccessor implements CompilablePropertyAccessor { + private final boolean allowWrite; + + /** + * Create a new map accessor for reading as well as writing. + * @see #MapAccessor(boolean) + */ + public MapAccessor() { + this(true); + } + + /** + * Create a new map accessor for reading and possibly also writing. + * @param allowWrite whether to allow write operations on a target instance + * @see #canWrite + */ + public MapAccessor(boolean allowWrite) { + this.allowWrite = allowWrite; + } + @Override public Class[] getSpecificTargetClasses() { return new Class[] {Map.class}; @@ -60,7 +80,7 @@ public class MapAccessor implements CompilablePropertyAccessor { @Override public boolean canWrite(EvaluationContext context, @Nullable Object target, String name) throws AccessException { - return true; + return this.allowWrite; } @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 7266570b76c..5f2dea2e9b5 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 @@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link MapAccessor}. * * @author Andy Clement + * @author Yanming Zhou */ class MapAccessorTests { @@ -80,6 +81,16 @@ class MapAccessorTests { assertThat(ex.getValue(sec,testMap)).isEqualTo("bar2"); } + @Test + void mapAccessorNotWritable() { + Map testMap = getSimpleTestMap(); + StandardEvaluationContext sec = new StandardEvaluationContext(); + sec.addPropertyAccessor(new MapAccessor(false)); + SpelExpressionParser sep = new SpelExpressionParser(); + Expression ex = sep.parseExpression("foo"); + assertThat(ex.isWritable(sec, testMap)).isFalse(); + } + public static class MapGetter { Map map = new HashMap<>(); From 821109bd06ccf76c288af6187509cf4ec7157efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 17 Jul 2024 11:34:47 +0200 Subject: [PATCH 2/2] Polish "Add support for making MapAccessor read-only" See gh-33222 --- .../org/springframework/context/expression/MapAccessor.java | 3 ++- .../springframework/context/expression/MapAccessorTests.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) 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 b523d1a5455..fb51e880b14 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 @@ -33,7 +33,6 @@ import org.springframework.util.Assert; * * @author Juergen Hoeller * @author Andy Clement - * @author Yanming Zhou * @since 3.0 */ public class MapAccessor implements CompilablePropertyAccessor { @@ -42,6 +41,7 @@ public class MapAccessor implements CompilablePropertyAccessor { /** * Create a new map accessor for reading as well as writing. + * @since 6.2 * @see #MapAccessor(boolean) */ public MapAccessor() { @@ -51,6 +51,7 @@ public class MapAccessor implements CompilablePropertyAccessor { /** * Create a new map accessor for reading and possibly also writing. * @param allowWrite whether to allow write operations on a target instance + * @since 6.2 * @see #canWrite */ public MapAccessor(boolean allowWrite) { 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 5f2dea2e9b5..8c7c63fd0f9 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 @@ -32,7 +32,6 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link MapAccessor}. * * @author Andy Clement - * @author Yanming Zhou */ class MapAccessorTests {