我正在使用Spring Integration开发Web应用程序来路由我的消息,但是我在传递标题值方面遇到了一些问题。我的消息通过路由器和服务激活器。
标头值在我的路由器的路由方法中可用,所以它似乎没问题。我们假设它不是问题(我通过禁用我的服务激活器来检查它。)
当涉及到我的服务激活方法时,会抛出以下错误: “无法在目标类MyService上找到任何名为 process 的有效消息处理方法。”
我 - 弹簧 - integration.xml
<channel id="route" />
<service-activator method="process" input-channel="route" ref="myService" output-channel="myOutputChannel" />
MyRouter.java
@Component
public class MyRouter {
public String router(String message, @Header("isValid") boolean isValid) {
// isValid is "true"
return "route";
}
}
MyService.java
@MessageEndpoint
@Transactional
public class MyService {
public void process(String message, @Header("isValid") boolean isValid) {
...
}
}
为什么?路由后是否删除了标头值?或者我的配置错了?我试图将@ServiceActivator注释添加到我的流程方法中,但它没有帮助。 任何帮助将不胜感激。
答案 0 :(得分:1)
我猜这是因为在服务上有@Transactional
注释而没有实现任何接口。
Spring将使用JDK动态代理实现事务逻辑,这些代理依赖于实现合适接口的代理类。有一个关于这个here的Spring博客。
为了解决这个问题,我建议您使用一个名为process的方法创建一个名为MyService的接口。然后让你服务实现这个界面。
答案 1 :(得分:0)
我正在使用遗留代码,这可能是由旧的Spring集成版本引起的。我的应用程序支持'@Headers',但它不支持'@Header'注释。我的路由器接受了@Header注释,这是接口而不是我的服务激活器,它没有实现任何接口。我怀疑它是由旧版本的spring integration或cglib引起的。