Как использовать SpEL для чтения содержимого полезной нагрузки и заголовка в Spring Integration Router - PullRequest
0 голосов
/ 22 марта 2019

Технологии в моем проекте

Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1

В рамках проекта Spring Integration (REST API с входящим http-шлюзом, который принимает входные данные XML и создает XMLвывод), я пишу следующие компоненты:

  1. Сервис-активатор, который выполняет базовую проверку входящего XML по его XSD.
  2. Если проверка прошла успешно, POJO (aJava-объект builder-pattern) создается с переменной / свойством Boolean экземпляра с именем isError, установленным в true.
  3. Если проверка не удалась, POJO (Java-объект builder-pattern) создается сЛогическая переменная / свойство экземпляра с именем "isError" установлена ​​в false.
  4. После создания POJO оно помещается в Сообщение и отправляется в выходной канал.
  5. Существует компонент маршрутизатора, которыйполучает сообщение из выходного канала и решает целевой маршрут / канал на основе значения свойства «isError» в полезной нагрузке / POJO.

Черновик POJO class (в действительности у POJO будет больше свойств, но в нашем примере он был коротким):

public class Composite {
    private Boolean isError;

    private Composite(CompositeBuilder compositeBuilder) {
            this.isError = miCompositeBuilder.isError;
        }

    public boolean isError() {
            return isError;
        }

    //Builder
    public static class CompositeBuilder {
        private Boolean isError;

        public CompositeBuilder(Boolean isError) {
            this.isError = isError;
        }      

        public Composite build() {
            return new Composite(this);
        }
    }
}

Компонент-активатор службы валидатора в XML:

<!-- SERVICE ACTIVATOR FOR REQUEST VALIDATION -->
    <int:service-activator ref="myService"
                           method="validateMYRequest"
                           input-channel="myGatewayRequests"
                           output-channel="compositesPostRequestValidation" />

МаршрутизаторКомпонент в XML:

<!-- ROUTER POST-REQUEST VALIDATION -->
    <int:router input-channel="compositesPostRequestValidation" expression="payload.isError">
        <int:mapping value="true" channel="upstreamResponses"/>
        <int:mapping value="false" channel="downstreamValidatedRequests"/>
    </int:router>

Наконец, на мои вопросы, в этом "роутере",

  • Вопрос 1) Что-то вроденеправильно с выражением SpEL (payload.isError), так как я получил исключение во время вызова маршрутизатора, которое выглядит так:

    org.springframework.expression.spel.SpelEvaluationException: EL1008E: Свойство или поле 'isError' не можетбыть найденным на объекте типа 'com.amb.restSample.core.model.Composite' - может быть не публичным или недействительным?в org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty (PropertyOrFieldReference.java:217) ~ [spring-expression-5.1.5.RELEASE.jar: 5.1.5.RELEASE] ... ... *

Подскажите, пожалуйста, как получить доступ к логическому свойству isError внутри Compoite POJO?Предполагается, что сообщение, отправляемое маршрутизатору, является сообщением

  • Вопрос 2) В случае, если я хочу разместить свойство "isError" в качестве заголовка сообщения (String) передотправляя его на маршрутизатор (вместо использования его в качестве логического свойства внутри составного POJO), есть ли выражение для доступа к нему?

1 Ответ

1 голос
/ 22 марта 2019

Похоже, что paylaod MIComposite не Composite.

В любом случае, SpEL использует соглашения JavaBean; поэтому isError() является получателем логического свойства error. Так что payload.error должно работать (пока MIComposite выставляет его). Или вы можете использовать payload.isError().

Если это в заголовке, выражение будет headers['myHeader'].

...