0

我正在使用 Spring Integration 开发 Web 应用程序来路由我的消息,但是我在传递我的标头值时遇到了一些问题。我的消息通过路由器和服务激活器。

标头值在我的路由器的路由方法中可用,所以它似乎没问题。让我们假设这不是问题(我通过禁用我的服务激活器来检查这一点)。

当涉及到我的服务激活器方法时,会引发以下错误:“无法在目标类 MyService 上找到任何名为process的有效消息处理方法。”

我的弹簧集成.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";
   } 

}

我的服务.java

@MessageEndpoint
@Transactional
public class MyService {

   public void process(String message, @Header("isValid") boolean isValid) {
      ...
   }

}

这是为什么?路由后是否会删除标头值?还是我的配置不对?我尝试将@ServiceActivator 注释添加到我的流程方法中,但没有帮助。任何帮助将不胜感激。

4

2 回答 2

1

我猜这是由于@Transactional在不实现任何接口的 Service 上有注释引起的。

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

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

于 2012-06-26T02:17:01.117 回答
0

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

于 2012-06-27T08:49:11.627 回答