首页 > 解决方案 > 在 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 版本相同。

标签: javaspringspring-expression

解决方案


推荐阅读