このルールは
org.springframework.expression.spel.support.SimpleEvaluationContext
への Expression.getValue(...).
Spring フレームワーク 6.0、 SimpleEvaluationContext では、式中の配列確保を完全に無効にするように変更された。 SpEL 式の配列確保を完全に無効にするように変更されました。 この変更は SimpleEvaluationContext SpEL を使用するコードに影響します。 を呼び出すような式を評価するコードに影響します。
Spring 6 に移行する際には、以下のすべての呼び出しを確認してください
Expression.getValue(...) ここで
SimpleEvaluationContext は 使用される。 評価される SpEL 式が、以下の機能でサポートされていない機能に依存していないことを確認する
SimpleEvaluationContext例えば 配列の作成やvarargsメソッドの呼び出しなど。
SpEL 式で配列の生成や varargs メソッドの呼び出しが必要な場合は、次のように切り替えます。 から
SimpleEvaluationContext へ
StandardEvaluationContextあるいは SpEL 式をリファクタリングして、そのような構文を完全に避ける。
次の例は、フラグが立てられる使い方を示している
SimpleEvaluationContext に渡される。 に渡されます。
Expression.getValue(...).しかし 式は、 Spring 6 の実行時に、配列の作成やvarargsのようなサポートされていない機能によって失敗する可能性がある。 で実行時に失敗する可能性があります。 式に関係なく、コンテキストの使用そのものにフラグを立てます。
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;
public class InvalidSpelArrayUsage {
public void failAtRuntime() {
SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
ExpressionParser parser = new SpelExpressionParser();
parser.parseExpression("new String[1]").getValue(context); // Should be flagged
parser.parseExpression("join('a', 'b', 'c')").getValue(context); // Should be flagged
}
}
次の例は
StandardEvaluationContext が使用される、 これは SpEL のすべての機能をサポートしている。
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class ValidSpelUsage {
public void worksCorrectly() {
StandardEvaluationContext context = new StandardEvaluationContext();
ExpressionParser parser = new SpelExpressionParser();
parser.parseExpression("new String[1]").getValue(context); // allowed
parser.parseExpression("join('a', 'b', 'c')").getValue(context); //allowed
}
}
詳しくは、以下のリソースを参照してください。