【问题标题】:Spring Integration Java DSL - @ServiceActivator method with @Header parameter annotationsSpring Integration Java DSL - 带有 @Header 参数注释的 @ServiceActivator 方法
【发布时间】:2015-06-04 21:23:32
【问题描述】:

我有一个带有以下签名的 Spring Integration 4 bean 方法:

@Component
public class AService {

    @ServiceActivator
    public Message<?> serviceMethod(
            Message<?> message,
            @Header(ServiceHeader.A_STATE) AState state,
            @Header(ServiceHeader.A_ID) String id) {

        ...
    }

    ...
}

目前,我从 Spring Integration Java DSL (spring-integration-java-dsl:1.0.1.RELEASE) 流程中调用此服务方法,如下所示:

.handle("aService", "serviceMethod")

这绝对没问题,但是我想知道是否可以通过以下方式调用服务方法:

.handle(Message.class, (m, h) -> aService.serviceMethod(m, h))

我想以这种方式调用服务方法的原因是,当有人使用 Eclipse 等 IDE 查看代码时,他们可以通过例如突出显示方法和按 F3。

所以我的问题是,是否有另一种方法来调用 @ServiceActivator 方法(包括 @Header 注释)而不在 .handle() 中使用字符串作为服务名称/服务方法?

【问题讨论】:

    标签: java-8 spring-integration


    【解决方案1】:

    不完全是,您不能传递整个消息和选定的标头,但您可以传递有效负载和单个标头...

    .handle(String.class, (p, h) -> aService().serviceMethod(p, 
         (AState) h.get(ServiceHeader.A_STATE),
         (String) h.get(ServiceHeader.A_ID)))
    

    (假设有效负载是String)。

    请注意,@Header 注释在这种情况下是没有意义的,因为您直接在 lambda 表达式中提取了标头。

    也不需要注解为@ServiceActivator;您可以通过这种方式调用任何 bean 方法。

    public Message<?> serviceMethod(
            String payload, AState state, String id) {
    
        ...
    }
    

    .handle("aService", "serviceMethod")
    

    变体是所有魔法发生的地方(将消息内容与方法参数匹配)。当然,当你想在 Java 中直接调用方法时,我们不能做任何“魔术”。

    【讨论】:

    • 谢谢加里。这很好地回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多