SimpleEvaluationContext desactiva la asignación de matrices

Esta regla marca el uso de org.springframework.expression.spel.support.SimpleEvaluationContext con Expression.getValue(...).

En Spring Framework 6.0, SimpleEvaluationContext se cambió para deshabilitar completamente las asignaciones de matrices en SpEL alineándose con el comportamiento estándar de resolución de constructores. Este cambio afecta al código que utiliza SimpleEvaluationContext para evaluar expresiones SpEL que crean matrices explícitamente o llaman a métodos con parámetros varargs.

Al migrar a Spring 6, revise todas las llamadas a Expression.getValue(...) donde a SimpleEvaluationContext . Asegúrese de que las expresiones SpEL evaluadas no se basan en funciones no admitidas en SimpleEvaluationContextcomo creación de arrays o llamadas a métodos varargs.

Si su caso de uso requiere la creación de matrices o llamadas a métodos varargs en una expresión SpEL, puede cambiar de SimpleEvaluationContext por: StandardEvaluationContexto refactorice sus expresiones SpEL para evitar por completo este tipo de construcciones.

El siguiente ejemplo muestra el uso que se marcará, porque SimpleEvaluationContext se pasa a Expression.getValue(...). Aunque las expresiones mostradas pueden fallar en tiempo de ejecución en Spring 6 debido a características no soportadas como la creación de arrays o varargs, esta regla marca el uso del contexto en sí mismo, independientemente de la expresión expresión.


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

El siguiente ejemplo muestra un uso válido en el que StandardEvaluationContext se utiliza, que admite todas las funciones de 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
        }
    }

Para obtener más información, consulte los recursos siguientes: