SimpleEvaluationContext отключает выделение массивов

Это правило фиксирует использование org.springframework.expression.spel.support.SimpleEvaluationContext с Expression.getValue(...).

В Spring Framework 6.0, SimpleEvaluationContext были внесены изменения, полностью запрещающие выделение массивов в SpEL выражениях, что согласуется со стандартным поведением разрешения конструкторов. Это изменение влияет на код, который использует SimpleEvaluationContext для оценки выражений SpEL, которые либо явно создают массивы, либо вызывают методы с параметрами varargs.

При переходе на Spring 6 пересмотрите все обращения к Expression.getValue(...) где а SimpleEvaluationContext это используется. Убедитесь, что вычисляемые выражения SpEL не опираются на функции, которые не поддерживаются в SimpleEvaluationContextтакие как создание массива или вызов метода varargs.

Если в вашем случае требуется создание массива или вызов метода varargs в выражении SpEL, вы можете либо переключиться с SimpleEvaluationContext к StandardEvaluationContextили рефакторить ваши выражения SpEL, чтобы полностью избежать таких конструкций.

В следующем примере показано использование, которое будет отмечено, потому что SimpleEvaluationContext передаётся на Expression.getValue(...). Хотя показанные выражения могут не работать во время выполнения в Spring 6 из-за неподдерживаемых функций, таких как создание массивов или varargs, это правило отмечает само использование контекста, независимо от выражения.


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

В следующем примере показано правильное использование, когда StandardEvaluationContext используется, который поддерживает все функции 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
        }
    }

Дополнительная информация: