Spring Integration Java DSL - 带@Header参数注释的{ServiceActivator方法

时间:2015-06-04 11:15:38

标签: java-8 spring-integration

我有一个带有以下签名的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()中使用服务名称/服务方法的字符串?< / p>

1 个答案:

答案 0 :(得分:3)

不完全是,您无法传递整个邮件和选定的标题,但您可以传递有效负载和各个标题...

.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调用方法时,我们不能做任何“魔术”。