SimpleEvaluationContext désactive les allocations de tableaux

Cette règle signale l'utilisation de org.springframework.expression.spel.support.SimpleEvaluationContext par Expression.getValue(...).

Dans le cadre Spring 6.0, SimpleEvaluationContext a été modifié pour désactiver complètement les allocations de tableaux dans les expressions SpEL s'alignant ainsi sur le comportement standard de résolution des constructeurs. Ce changement affecte le code qui utilise SimpleEvaluationContext pour évaluer les expressions SpEL qui créent explicitement des tableaux ou appellent des méthodes avec des paramètres varargs.

Lors de la migration vers Spring 6, passez en revue tous les appels à Expression.getValue(...) où un SimpleEvaluationContext est utilisé. Assurez-vous que les expressions SpEL évaluées ne s'appuient pas sur des fonctionnalités qui ne sont pas prises en charge par le système SimpleEvaluationContextcomme la la création de tableaux ou les appels de méthodes varargs.

Si votre cas d'utilisation nécessite la création de tableaux ou l'appel de méthodes varargs dans une expression SpEL, vous pouvez soit passer de de SimpleEvaluationContext à StandardEvaluationContextou refactoriser vos expressions SpEL pour éviter complètement ces constructions.

L'exemple suivant montre une utilisation qui sera signalée, parce que SimpleEvaluationContext est transmis à la Expression.getValue(...). Bien que les expressions affichées peuvent échouer à l'exécution dans Spring 6 en raison de fonctionnalités non supportées comme la création de tableaux ou de varargs, cette règle signale l'utilisation du contexte lui-même, indépendamment de l'expression expression.


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

L'exemple suivant montre une utilisation valide où StandardEvaluationContext est utilisé, qui prend en charge toutes les fonctionnalités 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
        }
    }

Pour plus d'informations, voir les ressources suivantes :