Java 8 Spring集成Java DSL-@ServiceActivator方法和@Header参数注释

Java 8 Spring集成Java DSL-@ServiceActivator方法和@Header参数注释,java-8,spring-integration,Java 8,Spring Integration,我有一个具有以下签名的Spring Integration 4 bean方法: @Component public class AService { @ServiceActivator public Message<?> serviceMethod( Message<?> message, @Header(ServiceHeader.A_STATE) AState state, @H

我有一个具有以下签名的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) {

        ...
    }

    ...
}
这工作非常好,但是我想知道是否可以通过以下方式调用服务方法:

.handle(Message.class, (m, h) -> aService.serviceMethod(m, h))
我希望以这种方式调用服务方法的原因是,当有人使用诸如Eclipse之类的IDE查看代码时,他们可以通过突出显示该方法并按F3等方式深入该服务的方法


所以我的问题是,有没有其他方法可以调用
@ServiceActivator
方法(包括
@Header
注释),而不使用
.handle()
中服务名称/服务方法的字符串?

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

.handle(String.class, (p, h) -> aService().serviceMethod(p, 
     (AState) h.get(ServiceHeader.A_STATE),
     (String) h.get(ServiceHeader.A_ID)))
(假设有效负载是一个
字符串

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

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

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

    ...
}

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

谢谢Gary。这很好地回答了我的问题。
public Message<?> serviceMethod(
        String payload, AState state, String id) {

    ...
}
.handle("aService", "serviceMethod")