java - 在 SpelCompilerMode.IMMEDIATE 模式下,SpEL 表达式无法评估第二个字符串文字值处理
问题描述
使用 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
和传递字符串而不是上下文对象是否有问题?
与最近的 5.1.10.RELEASE 版本相同。