Java 8 Spring集成Java DSL-@ServiceActivator方法和@Header参数注释
我有一个具有以下签名的Spring Integration 4 bean方法: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
@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")