Выражение SpEL не может быть обработано при обработке второго значения литерала String в режиме SpelCompilerMode.IMMEDIATE - PullRequest
1 голос
/ 16 октября 2019

Используя пружинное выражение версии 5.1.5, пытаясь оценить несколько значений, используя предварительно скомпилированное выражение SpEL, как в следующем фрагменте:

    String expression = "T(java.time.LocalDateTime).parse(#root, T(java.time.format.DateTimeFormatter).ofPattern(\"M/d/yy H:mm\")).toEpochSecond(T(java.time.ZoneOffset).UTC) * 1000";
    Expression spelExpression = expressionParser.parseExpression(expression);

    assertEquals(1514768400000L, (long)spelExpression.getValue("1/1/18 1:00"));
    assertEquals(1514854800000L, (long)spelExpression.getValue("1/2/18 1:00"));

Сбой при

java.lang.IllegalStateException: Failed to instantiate CompiledExpression

    at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:111)
    at org.springframework.expression.spel.standard.SpelExpression.compileExpression(SpelExpression.java:511)
    at org.springframework.expression.spel.standard.SpelExpression.checkCompile(SpelExpression.java:481)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:202)
...
Caused by: java.lang.VerifyError: (class: spel/Ex2, method: getValue signature: (Ljava/lang/Object;Lorg/springframework/expression/EvaluationContext;)Ljava/lang/Object;) Illegal type in constant pool
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.util.ReflectionUtils.accessibleConstructor(ReflectionUtils.java:530)
    at org.springframework.expression.spel.standard.SpelCompiler.compile(SpelCompiler.java:108)
...

То же самое хорошо работает в режиме SpelCompilerMode.OFF.

Обнаружено обсуждение чего-то похожего: https://github.com/spring-projects/spring-framework/issues/20739

Но речь идет о поддержке прокси и должна быть исправлена ​​в 5.1.5.

Есть ли способ использовать предварительно скомпилированный режим в моем случае? Является ли использование #root и передача строки вместо объекта контекста проблемой?

Та же ситуация с последней версией 5.1.10.RELEASE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...