SimpleEvaluationContext 禁用数组分配

该规则标记使用 org.springframework.expression.spel.support.SimpleEvaluationContext 以及 Expression.getValue(...).

在 Spring Framework 6.0 中, SimpleEvaluationContext 被修改为完全禁用表达式中的数组分配。 SpEL 表达式中完全禁用数组分配,与标准构造函数解析行为保持一致。 此更改会影响使用 SimpleEvaluationContext 来评估 SpEL 表达式的代码,这些表达式要么明确创建数组,要么调用带有 参数的方法。

当迁移到 Spring 6 时,审查所有调用 Expression.getValue(...) 其中 a SimpleEvaluationContext 是 使用。 确保已求值的 SpEL 表达式不依赖于在 SimpleEvaluationContext例如 数组创建或 varargs 方法调用。

如果您的用例需要在 SpEL 表达式中创建数组或调用 varargs 方法,您可以将 从 SimpleEvaluationContextStandardEvaluationContext,或 重构 SpEL 表达式,以完全避免使用此类结构。

下面的示例显示了会被标记的使用情况,因为 SimpleEvaluationContext 传递给 给 Expression.getValue(...).虽然 表达式在 Spring 6 中可能会因为不支持数组创建或 varargs 等功能而在运行时失败。 不支持的特性(如数组创建或 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
        }
    }

有关更多信息,请参阅以下资源: