我正在尝试将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)
答案 0 :(得分:1)
创建上下文并为每个请求解析表达式是浪费的,除非每个请求都不同;在这种情况下,请考虑缓存表达式/上下文。
正如我所说,由于您将rootObject
传递给getValue()
,您的myPojo
被“隐藏” - 评估始终在LIB_MAP
上执行。
您需要在没有根对象的情况下调用getValue()
来使用上下文的根对象。您可以将LIB_MAP
添加为变量(例如,使用名称nationalityLookup
)并使用
payload['channel'] == #nationalityLookup.resolveChannel('CBR1000')