在Spring Integration中使用@Header注释进行服务激活方法映射

时间:2012-06-25 16:23:21

标签: spring annotations messaging spring-integration

我正在使用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注释添加到我的流程方法中,但它没有帮助。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我猜这是因为在服务上有@Transactional注释而没有实现任何接口。

Spring将使用JDK动态代理实现事务逻辑,这些代理依赖于实现合适接口的代理类。有一个关于这个here的Spring博客。

为了解决这个问题,我建议您使用一个名为process的方法创建一个名为MyService的接口。然后让你服务实现这个界面。

答案 1 :(得分:0)

我正在使用遗留代码,这可能是由旧的Spring集成版本引起的。我的应用程序支持'@Headers',但它不支持'@Header'注释。我的路由器接受了@Header注释,这是接口而不是我的服务激活器,它没有实现任何接口。我怀疑它是由旧版本的spring integration或cglib引起的。