Spring Integration DSL: трансформатор с использованием заголовков - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу использовать Java DSL для Spring Integration, но я не могу понять, как использовать заголовки сообщений во время преобразования.

В моей старой реализации был такой преобразователь:

@Transformer(inputChannel = "inputChannel", outputChannel = "outputChannel")
public EventB transform(
        EventA eventA,
        @Header("a_header") String aHeader,
        @Header("other_header") String otherHeader){
    return new EventB(eventA.getSomeField(), aHeader, otherHeader);
}

Теперь у меня есть следующий DSL:

@Bean
public IntegrationFlow aFlow(){
    return IntegrationFlows.from(EventASink.INPUT)
        .filter("headers['operation'] == 'OPERATION_A'")
        .transform() //<-- What should I do here?
        .handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))
        .get();
}

Я посмотрел на реализацию метода transform () и обнаружил, что он может получать GenericTransformer в качестве параметра, но, похоже, он работает только с полезной нагрузкой сообщения иМне также нужны заголовки.

Я также видел, что можно использовать какое-то отражение, но мне оно не нравится, потому что оно не безопасно для рефактора.

Любой совет?Заранее спасибо.

1 Ответ

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

Поскольку DSL является частью Framework и он компилируется до того, как вы начнете его использовать, мы не можем вывести какие-либо пользовательские методы POJO, поэтому нет такого чистого способа подсчета с любыми пользовательскими заголовками, как в вашем примере..

Закрытый способ повторного использования вашего transform() с этими аннотациями к параметрам заключается в следующем .transform() контракте:

/**
 * Populate the {@code MessageTransformingHandler} for the {@link MethodInvokingTransformer}
 * to invoke the service method at runtime.
 * @param service the service to use.
 * @param methodName the method to invoke.
 * @return the current {@link IntegrationFlowDefinition}.
 * @see MethodInvokingTransformer
 */
public B transform(Object service, String methodName)

Итак, вам нужно объявить компонент сэтот метод и используйте его в аргументе service. В то же время упомяните метод в аргументе methodName.

Другой способ получить доступ к заголовкам - запросить полный тип Message для лямбды:

/**
 * Populate the {@link MessageTransformingHandler} instance for the provided
 * {@link GenericTransformer} for the specific {@code payloadType} to convert at
 * runtime.
 * Use {@link #transform(Class, GenericTransformer)} if you need access to the
 * entire message.
 * @param payloadType the {@link Class} for expected payload type. It can also be
 * {@code Message.class} if you wish to access the entire message in the transformer.
 * Conversion to this type will be attempted, if necessary.
 * @param genericTransformer the {@link GenericTransformer} to populate.
 * @param <P> the payload type - 'transform from' or {@code Message.class}.
 * @param <T> the target type - 'transform to'.
 * @return the current {@link IntegrationFlowDefinition}.
 * @see MethodInvokingTransformer
 * @see LambdaMessageProcessor
 */
public <P, T> B transform(Class<P> payloadType, GenericTransformer<P, T> genericTransformer) {

В этом случае код может быть таким:

  .transform(Message.class, m -> m.getHeaders())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...