Spring Integration Flow: фильтр на основе заголовков без выражения SpEl - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть следующий поток интеграции Spring:

@Bean
public IntegrationFlow checkoutEventFlow(){
    return IntegrationFlows.from(EventASink.INPUT)
        .filter("headers['type'] == 'TYPE_A'") //1
        .transform(Transformers.fromJson(EventA.class)) //2
        .<EventA, EventB> transform(eventA ->
            new EventB(
                eventA.getSomeField(),
                eventB.getOtherField()))
        .handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))
        .get();
}

1) Я хотел бы отфильтровать сообщение по заголовкам без использования выражения SpEl (см. // 1), возможно ли это?

2) Есть ли другой механизм для преобразования JSON в POJO без // 2?Мне нравится, как @StreamListener может быть написан в терминах POJO, а преобразование выполняется за кулисами.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Без SpEL в filter() вы можете вместо этого использовать лямбду Java:

.filter(Message.class, m -> m.getHeaders().get("type") == "TYPE_A")

Spring Cloud Stream - это самоуверенная платформа, где JSON является типом содержимого по умолчанию для данных, проходящих через поток иза пределами / из целевой системы обмена сообщениями.

Spring Integration - это библиотека, позволяющая создавать интеграционные приложения.Там у нас просто не может быть никакого мнения относительно какой-либо конвертации типов контента по умолчанию.Там нет никаких нестандартных предположений, что вы собираетесь преобразовать свой входящий byte[] в какой-нибудь POJO из-за JSON.Несмотря на то, что мы немного учитываем некоторые возможности, которые видны так же, как и Spring Cloud Stream, в обработчике метода POJO есть ловушка для преобразования из JSON в ожидаемый POJO.Но это делается только для пользовательских методов POJO, когда они также помечены @serviceActivator.Отсюда мы не можем принять ваши ожидания в .transform() лямбде.Вам нужно иметь какой-то сервис с методом и использовать его в:

/**
 * Populate a {@link ServiceActivatingHandler} for the
 * {@link org.springframework.integration.handler.MethodInvokingMessageProcessor}
 * to invoke the {@code method} for provided {@code bean} at runtime.
 * In addition accept options for the integration endpoint using {@link GenericEndpointSpec}.
 * @param service the service object to use.
 * @param methodName the method to invoke.
 * @return the current {@link IntegrationFlowDefinition}.
 */
public B handle(Object service, String methodName) {

Таким образом, он будет работать так же, как в Spring Cloud Stream с @StreamListener.

...