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()?
不完全是,您无法传递整个消息和选定的标头,但您可以传递有效负载和单个标头......
.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中直接调用该方法时,我们无法做任何“魔术”。
| 归档时间: |
|
| 查看次数: |
2273 次 |
| 最近记录: |