Выражение SpEL не может быть вычислено при обработке второго строкового литерала в режиме SpelCompilerMode.IMMEDIATE
Используя spring-expression версии 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
и передача String вместо объекта контекста проблема?
Такая же ситуация и с последней версией 5.1.10.RELEASE.