SimpleEvaluationContext zakáže alokaci pole

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: