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: