SimpleEvaluationContext wyłącza alokację tablic

Ta reguła oznacza użycie org.springframework.expression.spel.support.SimpleEvaluationContext z Expression.getValue(...).

W Spring Framework 6.0, SimpleEvaluationContext został zmieniony, aby w pełni wyłączyć alokacje tablic w wyrażeniach SpEL zgodnie ze standardowym zachowaniem rozdzielczości konstruktora. Zmiana ta ma wpływ na kod, który używa SimpleEvaluationContext do oceny wyrażeń SpEL, które albo jawnie tworzą tablice, albo wywołują metody z parametrami varargs.

Podczas migracji do Spring 6 należy przejrzeć wszystkie wywołania do Expression.getValue(...) gdzie a SimpleEvaluationContext jest używany. Upewnij się, że oceniane wyrażenia SpEL nie opierają się na funkcjach, które nie są obsługiwane w SimpleEvaluationContexttakie jak tworzenie tablic lub wywołania metod varargs.

Jeśli dany przypadek użycia wymaga utworzenia tablicy lub wywołania metody varargs w wyrażeniu SpEL, można przełączyć opcję z SimpleEvaluationContext do StandardEvaluationContextlub refaktoryzować wyrażenia SpEL, aby całkowicie uniknąć takich konstrukcji.

Poniższy przykład pokazuje użycie, które zostanie oflagowane, ponieważ SimpleEvaluationContext jest przekazywany do Expression.getValue(...). Podczas gdy mogą zawieść w czasie wykonywania w Spring 6 z powodu nieobsługiwanych funkcji, takich jak tworzenie tablic lub varargs, ta reguła oznacza samo użycie kontekstu, niezależnie od wyrażenia.


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

Poniższy przykład pokazuje prawidłowe użycie, w którym StandardEvaluationContext jest używany, który obsługuje wszystkie funkcje 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
        }
    }

Więcej informacji na ten temat zawierają następujące zasoby: