From d2bd0d57160624f0c5246faa665bb0b882fc431b Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:41:14 +0100 Subject: [PATCH] Retain null-safe syntax in AST representation of SpEL indexers Prior to this commit, SpEL's CompoundExpression omitted the null-safe syntax in AST string representations of indexing operations. To address this, this commit implements isNullSafe() in Indexer. See gh-29847 --- .../org/springframework/expression/spel/ast/Indexer.java | 9 +++++++++ .../springframework/expression/spel/ParsingTests.java | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java index 59c4fdaf21..2236868a6f 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Indexer.java @@ -127,6 +127,15 @@ public class Indexer extends SpelNodeImpl { } + /** + * Does this node represent a null-safe index operation? + * @since 6.2 + */ + @Override + public final boolean isNullSafe() { + return this.nullSafe; + } + @Override public TypedValue getValueInternal(ExpressionState state) throws EvaluationException { return getValueRef(state).getValue(); diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/ParsingTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/ParsingTests.java index 4eebccab49..2a0ce84bbc 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/ParsingTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/ParsingTests.java @@ -60,8 +60,8 @@ class ParsingTests { parseCheck("property1?.property2?.methodOne()"); parseCheck("property1?.methodOne('enigma')?.methodTwo(42)"); parseCheck("property1?.methodOne()?.property2?.methodTwo()"); - parseCheck("property1[0]?.property2['key']?.methodTwo()"); - parseCheck("property1[0][1]?.property2['key'][42]?.methodTwo()"); + parseCheck("property1?.[0]?.property2?.['key']?.methodTwo()"); + parseCheck("property1?.[0]?.[1]?.property2?.['key']?.[42]?.methodTwo()"); } @Test