SimpleEvaluationContext 停用陣列分配

此規則標記使用 org.springframework.expression.spel.support.SimpleEvaluationContext () Expression.getValue(...).

在 Spring Framework 6.0 中, SimpleEvaluationContext 被修改為完全禁止在 SpEL 表達式中完全停用陣列分配,與標準的構建程式解析行為一致。 此變更會影響使用 SimpleEvaluationContext 來評估 SpEL 表達式的程式碼,這些表達式或是明確地建立陣列,或是呼叫有 varargs 參數的方法。 與 varargs 參數的方法。

當遷移至 Spring 6 時,請檢閱所有呼叫 Expression.getValue(...) 其中 a SimpleEvaluationContext 是 使用。 確保已評估的 SpEL 表達式不會依賴在 SimpleEvaluationContext,例如 陣列建立或 varargs 方法呼叫。

如果您的用例需要在 SpEL 表達式中建立陣列或呼叫 varargs 方法,您可以切換 從 SimpleEvaluationContext 收件者 StandardEvaluationContext, 或 重組您的 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
        }
    }

如需相關資訊,請參閱下列資源: