Вызвать одни и те же выражения Spring EL с разными типами корневых объектов не удается - PullRequest
0 голосов
/ 28 мая 2018

Давайте рассмотрим следующий тест:

@Test
public void testSameExpressionDifferentRootObjectClass() {
    SpelParserConfiguration config = new SpelParserConfiguration(SpelCompilerMode.IMMEDIATE, Thread.currentThread().getContextClassLoader());
    SpelExpressionParser parser = new SpelExpressionParser(config);
    StandardEvaluationContext context = new StandardEvaluationContext();
    Expression expr = parser.parseExpression("'Test: ' + #root");

    assertThat(expr.getValue(context, 42L)).isEqualTo("Test: 42");
    assertThat(expr.getValue(context, "string")).isEqualTo("Test: string");
    assertThat(expr.getValue(context, 42L)).isEqualTo("Test: 42");
    assertThat(expr.getValue(context, "string")).isEqualTo("Test: string");
}

Не удалось выполнить третье утверждение со следующим исключением:

org.springframework.expression.spel.SpelEvaluationException: EL1072E: Возникла исключительная ситуация при оценке скомпилированного выражения

в org.springframework.expression.spel.standard.SpelExpression.getValue (SpelExpression.java:328) в org.example.ExpressionTest.testSameExpressionDifferentRootOjrovrovTess (36):)

Причина: java.lang.ClassCastException: java.lang.Long не может быть приведен к java.lang.String в spel.Ex2.getValue (неизвестный источник) в org.springframework.expression.spel.standard.SpelExpression.getValue (SpelExpression.java:318) ... еще 31

Это неожиданно для меня и ничего не нашло в документации по этому ограничению.Я что-то здесь не так сделал?

1 Ответ

0 голосов
/ 28 мая 2018

Вы должны использовать режим MIXED для подобных случаев;увидеть Javadocs ...

public enum SpelCompilerMode {

    /**
     * The compiler is switched off; this is the default.
     */
    OFF,

    /**
     * In immediate mode, expressions are compiled as soon as possible (usually after 1 interpreted run).
     * If a compiled expression fails it will throw an exception to the caller.
     */
    IMMEDIATE,

    /**
     * In mixed mode, expression evaluation silently switches between interpreted and compiled over time.
     * After a number of runs the expression gets compiled. If it later fails (possibly due to inferred
     * type information changing) then that will be caught internally and the system switches back to
     * interpreted mode. It may subsequently compile it again later.
     */
    MIXED

}
...