Spring | SPEL 多个 属性 访问器

Spring | SPEL multiple property accessors

我正在尝试将 SPeL 与多个 属性 访问器一起使用。

StandardEvaluationContext simpleContext = new StandardEvaluationContext(myPojo);
        simpleContext.setVariable("ctx", ruleExecutionContext);
        simpleContext.setPropertyAccessors(Arrays.asList(new MapAccessor(), new ReflectivePropertyAccessor()));
        ExpressionParser parser = new SpelExpressionParser();
        return (Boolean) parser.parseExpression(spelExpression).getValue(simpleContext, RulebaseConfiguration.LIB_MAP);

RulebaseConfiguration.LIB_MAP 包含 {"instanceName": instance}

我想传递可以在 POJO 上运行的表达式以及在实例上调用方法。但是只把map带进去效果。

我收到这个错误:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'payload' cannot be found on object of type 'java.util.HashMap' - maybe not public?] with root cause
org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'payload' cannot be found on object of type 'java.util.HashMap' - maybe not public?
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:226)
  1. 为每个请求创建上下文并解析表达式是一种浪费,除非每个请求都不同;在这种情况下,考虑缓存 expressions/contexts.

  2. 正如我所说,由于您将 rootObject 传递给 getValue(),因此您的 myPojo 是 "hidden" - 始终执行评估LIB_MAP.

您需要在没有根对象的情况下调用 getValue() 才能使用上下文的根对象。您可以添加 LIB_MAP 作为变量(例如名称 nationalityLookup)并使用

payload['channel'] == #nationalityLookup.resolveChannel('CBR1000')