我有一个带有以下签名的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>
答案 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调用方法时,我们不能做任何“魔术”。