SimpleEvaluationContext disabilita l'allocazione degli array

Questa regola segnala l'uso di org.springframework.expression.spel.support.SimpleEvaluationContext con Expression.getValue(...).

In Spring Framework 6.0, SimpleEvaluationContext è stato modificato per disabilitare completamente l'allocazione di array nelle espressioni SpEL allineandosi al comportamento standard di risoluzione dei costruttori. Questa modifica riguarda il codice che utilizza SimpleEvaluationContext per valutare le espressioni di SpEL che creano array in modo esplicito o chiamano metodi con parametri varargs.

Durante la migrazione a Spring 6, rivedere tutte le chiamate a Expression.getValue(...) dove a SimpleEvaluationContext è utilizzato. Assicurarsi che le espressioni SpEL valutate non si basino su caratteristiche non supportate in SimpleEvaluationContextcome la creazione di creazione di array o chiamate di metodi varargs.

Se il caso d'uso richiede la creazione di un array o la chiamata di un metodo varargs in un'espressione di SpEL, è possibile passare da SimpleEvaluationContext a StandardEvaluationContextoppure rifattorizzare le espressioni di SpEL per evitare del tutto questi costrutti.

L'esempio seguente mostra l'utilizzo che verrà segnalato, perché SimpleEvaluationContext viene passato a Expression.getValue(...). Mentre le mostrate possono fallire in fase di esecuzione in Spring 6 a causa di caratteristiche non supportate come la creazione di array o di non supportate, come la creazione di array o di vararg, questa regola segnala l'uso del contesto stesso, a prescindere dall'espressione espressione.


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'esempio seguente mostra un utilizzo valido in cui StandardEvaluationContext è utilizzato, che supporta tutte le funzioni di 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
        }
    }

Per ulteriori informazioni, consultare le seguenti risorse: