SimpleEvaluationContext dezactivează alocarea array-urilor

Această regulă semnalează utilizarea org.springframework.expression.spel.support.SimpleEvaluationContext cu Expression.getValue(...).

În cadrul Spring 6.0, SimpleEvaluationContext a fost modificat pentru a dezactiva complet alocările de matrice în SpEL aliniindu-se la comportamentul standard de rezolvare a constructorilor. Această modificare afectează codul care utilizează SimpleEvaluationContext pentru a evalua expresiile SpEL care fie creează în mod explicit matrici, fie apelează metode cu parametri varargs.

La migrarea la Spring 6, revizuiți toate apelurile către Expression.getValue(...) unde a SimpleEvaluationContext este utilizat. Asigurați-vă că expresiile SpEL evaluate nu se bazează pe caracteristici care nu sunt acceptate în SimpleEvaluationContext, cum ar fi crearea de matrice sau apelurile la metoda varargs.

Dacă cazul dvs. de utilizare necesită crearea unui array sau apelarea metodei varargs într-o expresie SpEL, puteți fie să comutați de la SimpleEvaluationContext până la StandardEvaluationContext, sau refacționați expresiile SpEL pentru a evita complet astfel de construcții.

Următorul exemplu arată utilizarea care va fi marcată, deoarece SimpleEvaluationContext este transmisă către Expression.getValue(...). În timp ce expresiile prezentate pot eșua în timpul execuției în Spring 6 din cauza unor caracteristici nesuportate cum ar fi crearea de matrice sau varargs, această regulă semnalează utilizarea contextului în sine, indiferent de expresie.


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

Următorul exemplu arată o utilizare valabilă în care StandardEvaluationContext este utilizat, care acceptă toate caracteristicile 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
        }
    }

Pentru informaţii suplimentare, vedeţi resursele următoare: