Toto pravidlo označuje použití
org.springframework.expression.spel.support.SimpleEvaluationContext
s Expression.getValue(...).
V systému Spring Framework 6.0, SimpleEvaluationContext byla provedena změna, která zcela zakázala alokaci polí v SpEL výrazů, což je v souladu se standardním chováním při řešení konstruktorů. Tato změna se týká kódu, který používá SimpleEvaluationContext k vyhodnocování výrazů SpEL, které buď explicitně vytvářejí pole, nebo volají metody s parametry varargs.
Při přechodu na Spring 6 zkontrolujte všechna volání na
Expression.getValue(...) kde a
SimpleEvaluationContext je používá. Zajistěte, aby vyhodnocované výrazy SpEL nespoléhaly na funkce, které nejsou v systému podporovány
SimpleEvaluationContext, jako např vytváření polí nebo volání metod varargs.
Pokud váš případ použití vyžaduje vytvoření pole nebo volání metody varargs ve výrazu SpEL, můžete buď přepnout z
SimpleEvaluationContext do
StandardEvaluationContext, nebo refaktorujte své výrazy SpEL tak, abyste se těmto konstrukcím zcela vyhnuli.
Následující příklad ukazuje použití, které bude označeno, protože
SimpleEvaluationContext je předán na adresu
Expression.getValue(...). Zatímco zobrazené výrazy mohou při spuštění v systému Spring 6 selhat kvůli nepodporovanému systému funkcí, jako je vytváření polí nebo varargů, toto pravidlo označuje samotné použití kontextu bez ohledu na to, zda je kontext výrazu.
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
}
}
Následující příklad ukazuje platné použití, kdy
StandardEvaluationContext se používá, který podporuje všechny funkce 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
}
}
Další informace viz následující prostředky: