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 :