Весна | 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 ответ

Решение
  1. Создание контекста и синтаксический анализ выражения для каждого запроса расточительны, если они не отличаются для каждого запроса; в этом случае рассмотрите кэширование выражений / контекстов.

  2. Как я уже сказал, так как вы передаете rootObject в getValue(), ваш myPojo скрыто - оценка всегда выполняется LIB_MAP,

Вам нужно позвонить getValue() без корневого объекта, чтобы использовать корневой объект контекста. Можете добавить LIB_MAP как переменная (например, с именем nationalityLookup) и использовать

payload['channel'] == #nationalityLookup.resolveChannel('CBR1000')
Другие вопросы по тегам