SimpleEvaluationContext desativa as alocações de matriz

Essa regra sinaliza o uso de org.springframework.expression.spel.support.SimpleEvaluationContext com o Expression.getValue(...).

Em Spring Framework 6.0, SimpleEvaluationContext foi alterado para desativar totalmente as alocações de matriz em SpEL alinhando-se ao comportamento padrão de resolução de construtores. Essa alteração afeta o código que usa SimpleEvaluationContext para avaliar SpEL expressões que criam arrays explicitamente ou chamam métodos com parâmetros varargs.

Ao migrar para Spring 6, revise todas as chamadas para Expression.getValue(...) onde a SimpleEvaluationContext será utilizado. Certifique-se de que as expressões SpEL avaliadas não dependam de recursos que não são compatíveis com o SimpleEvaluationContextcomo, por exemplo criação de matriz ou chamadas de método varargs.

Se o seu caso de uso exigir a criação de uma matriz ou chamadas de métodos varargs em uma expressão SpEL, você poderá alternar de SimpleEvaluationContext para StandardEvaluationContextou refatore suas expressões SpEL para evitar totalmente essas construções.

O exemplo a seguir mostra o uso que será sinalizado, porque SimpleEvaluationContext é passado para Expression.getValue(...). Embora as expressões mostradas possam falhar em tempo de execução em Spring 6 devido a recursos não suportados como criação de array ou varargs, essa regra sinaliza o uso do contexto em si, independentemente da expressão.


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

O exemplo a seguir mostra um uso válido em que StandardEvaluationContext é usado, que oferece suporte a todos os recursos do site 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 obter informações adicionais, consulte os recursos a seguir: