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

Spring Integration Java DSL - @ServiceActivator method with @Header parameter annotations

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

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

所以我的问题是,是否有另一种方法可以调用 @ServiceActivator 方法(包括 @Header 注释),而无需在 [=17] 中使用服务 name/service 方法的字符串=]?

不完全是,您不能传递整个消息并选择 headers,但您可以传递有效载荷和单个 headers...

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

(假设有效载荷是 String)。

请注意,@Header 注释在这种情况下是没有意义的,因为您是直接拉出 lambda 表达式中的 headers。

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

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

    ...
}

.handle("aService", "serviceMethod")

变化是所有魔法发生的地方(将消息内容与方法参数相匹配)。当然,如果想直接在Java.

中调用方法,我们就不能做任何"magic"