Весна | SPEL несколько свойств собственности
Я пытаюсь использовать 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 ответ
Создание контекста и синтаксический анализ выражения для каждого запроса расточительны, если они не отличаются для каждого запроса; в этом случае рассмотрите кэширование выражений / контекстов.
Как я уже сказал, так как вы передаете
rootObject
вgetValue()
, вашmyPojo
скрыто - оценка всегда выполняетсяLIB_MAP
,
Вам нужно позвонить getValue()
без корневого объекта, чтобы использовать корневой объект контекста. Можете добавить LIB_MAP
как переменная (например, с именем nationalityLookup
) и использовать
payload['channel'] == #nationalityLookup.resolveChannel('CBR1000')