SimpleEvaluationContext letiltja a tömbkiosztást

Ez a szabály jelzi a org.springframework.expression.spel.support.SimpleEvaluationContext a címen Expression.getValue(...).

A Spring keretrendszerben 6.0, a SimpleEvaluationContext úgy lett módosítva, hogy teljesen letiltja a tömbkiosztást a SpEL kifejezésekben, igazodva a standard konstruktor feloldási viselkedéshez. Ez a változás olyan kódot érint, amely a SimpleEvaluationContext a SpEL kifejezések kiértékelésére használ, amelyek vagy explicit módon hoznak létre tömböket, vagy meghívják a metódusokat varargs paraméterekkel rendelkező metódusokat hívnak.

A Spring 6-ra történő áttéréskor vizsgálja felül az összes hívást a Expression.getValue(...) ahol a SimpleEvaluationContext a használják. Győződjön meg róla, hogy az értékelt SpEL kifejezések nem támaszkodnak olyan tulajdonságokra, amelyek nem támogatottak a következő rendszerben SimpleEvaluationContext, mint például tömb létrehozása vagy varargs metódushívások.

Ha a felhasználási esete tömb létrehozását vagy varargs metódushívást igényel a SpEL kifejezésben, akkor vagy átkapcsolhatja a a SimpleEvaluationContext eddig: StandardEvaluationContext, vagy alakítsa át a SpEL kifejezéseket úgy, hogy teljesen elkerülje az ilyen konstrukciókat.

A következő példa olyan használatot mutat, amely jelölésre kerül, mert SimpleEvaluationContext átadásra kerül a címre Expression.getValue(...). Míg a kifejezések a Spring 6 alatt futás közben meghiúsulhatnak a nem támogatott tulajdonságok miatt, mint például a tömbök létrehozása vagy a varargs, ez a szabály magát a kontextus használatát jelzi, függetlenül a kifejezéstől függetlenül.


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

A következő példa egy érvényes felhasználási módot mutat, ahol StandardEvaluationContext használják, amely támogatja az összes SpEL funkciót.


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

Az alábbi információforrások nyújtanak további tájékoztatást: