SimpleEvaluationContext deaktiviert Array-Zuweisungen

Diese Regel kennzeichnet die Verwendung von org.springframework.expression.spel.support.SimpleEvaluationContext mit Expression.getValue(...).

In Spring Framework 6.0 wurde SimpleEvaluationContext geändert, um Array-Zuweisungen in Ausdrücken vollständig zu deaktivieren SpEL ausdrücken zu deaktivieren, was dem Standardverhalten der Konstruktorauflösung entspricht. Diese Änderung betrifft Code, der SimpleEvaluationContext verwendet, um SpEL Ausdrücke auszuwerten, die entweder explizit Arrays erzeugen oder Methoden mit varargs-Parametern aufrufen.

Bei der Migration auf Spring 6 sollten Sie alle Aufrufe von Expression.getValue(...) wobei a SimpleEvaluationContext ist verwendet. Stellen Sie sicher, dass die ausgewerteten SpEL Ausdrücke sich nicht auf Merkmale stützen, die in SimpleEvaluationContextwie z.B array-Erstellung oder varargs-Methodenaufrufe.

Wenn Ihr Anwendungsfall Array-Erstellung oder varargs-Methodenaufrufe in einem SpEL Ausdruck erfordert, können Sie entweder von SimpleEvaluationContext in StandardEvaluationContextoder refactoring Ihrer SpEL Ausdrücke, um solche Konstrukte ganz zu vermeiden.

Das folgende Beispiel zeigt eine Verwendung, die gekennzeichnet wird, weil SimpleEvaluationContext wird weitergegeben an Expression.getValue(...). Während die ausdrücke zur Laufzeit in Spring 6 aufgrund von nicht unterstützten funktionen wie Array-Erstellung oder Varargs scheitern können, kennzeichnet diese Regel die Kontextverwendung selbst, unabhängig vom ausdrucks.


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
        }
    }

Das folgende Beispiel zeigt eine gültige Verwendung, bei der StandardEvaluationContext verwendet wird, die alle Funktionen von SpEL unterstützt.


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
        }
    }

Weitere Informationen finden Sie in den folgenden Quellen: