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

Goi*_*nas 4 spring-integration java-8

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

        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

.handle("aService", "serviceMethod")
Run Code Online (Sandbox Code Playgroud)

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

.handle(Message.class, (m, h) -> aService.serviceMethod(m, h))
Run Code Online (Sandbox Code Playgroud)

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

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

Gar*_*ell 5

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

.handle(String.class, (p, h) -> aService().serviceMethod(p, 
     (AState) h.get(ServiceHeader.A_STATE),
     (String) h.get(ServiceHeader.A_ID)))
Run Code Online (Sandbox Code Playgroud)

(假设有效负载是 a String)。

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

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

.handle("aService", "serviceMethod")
Run Code Online (Sandbox Code Playgroud)

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