Această regulă semnalează utilizarea
org.springframework.expression.spel.support.SimpleEvaluationContext
cu Expression.getValue(...).
În cadrul Spring 6.0, SimpleEvaluationContext a fost modificat pentru a dezactiva complet alocările de matrice în SpEL aliniindu-se la comportamentul standard de rezolvare a constructorilor. Această modificare afectează codul care utilizează SimpleEvaluationContext pentru a evalua expresiile SpEL care fie creează în mod explicit matrici, fie apelează metode cu parametri varargs.
La migrarea la Spring 6, revizuiți toate apelurile către
Expression.getValue(...) unde a
SimpleEvaluationContext este utilizat. Asigurați-vă că expresiile SpEL evaluate nu se bazează pe caracteristici care nu sunt acceptate în
SimpleEvaluationContext, cum ar fi crearea de matrice sau apelurile la metoda varargs.
Dacă cazul dvs. de utilizare necesită crearea unui array sau apelarea metodei varargs într-o expresie SpEL, puteți fie să comutați de la
SimpleEvaluationContext până la
StandardEvaluationContext, sau refacționați expresiile SpEL pentru a evita complet astfel de construcții.
Următorul exemplu arată utilizarea care va fi marcată, deoarece
SimpleEvaluationContext este transmisă către
Expression.getValue(...). În timp ce expresiile prezentate pot eșua în timpul execuției în Spring 6 din cauza unor caracteristici nesuportate cum ar fi crearea de matrice sau varargs, această regulă semnalează utilizarea contextului în sine, indiferent de expresie.
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
}
}
Următorul exemplu arată o utilizare valabilă în care
StandardEvaluationContext este utilizat, care acceptă toate caracteristicile 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
}
}
Pentru informaţii suplimentare, vedeţi resursele următoare: