春天| SPEL多个属性访问器

时间:2017-08-07 13:14:58

标签: spring spring-boot spring-el

我正在尝试将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上运行的表达式以及在实例上调用方法。但它只需要映射效果。

我收到此错误:

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 个答案:

答案 0 :(得分:1)

  1. 创建上下文并为每个请求解析表达式是浪费的,除非每个请求都不同;在这种情况下,请考虑缓存表达式/上下文。

  2. 正如我所说,由于您将rootObject传递给getValue(),您的myPojo被“隐藏” - 评估始终在LIB_MAP上执行。

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

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