【问题标题】:Service activator method mapping using @Header annotation in Spring Integration在 Spring Integration 中使用 @Header 注解的服务激活器方法映射
【发布时间】:2012-06-25 16:23:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我尝试按照您所拥有的配置进行配置,它对我来说很干净。您能否提供您的 Spring Integration 版本
  • 有什么办法可以升级到2.0+版本,1.0.4是比较老的版本了?
  • 不是真的,但据了解 1.04 版本在这种情况下应该不是问题。
  • 我猜你是对的。我的应用程序支持“标题”,但不支持“标题”注释。不知道具体原因,估计是spring集成版本的问题。

标签: spring annotations messaging spring-integration


【解决方案1】:

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

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

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

【讨论】:

  • 感谢文章的链接,但我使用不需要接口的 CGLib 代理。我提供了默认构造函数(必需),但仍然没有改进。
  • 有趣。在那种情况下,我怀疑这是问题所在!
  • 我正在使用遗留代码,它可能是由旧的 spring 集成版本引起的。使用 'Headers' 注释而不是 'Header' 解决了这个问题。感谢有关代理的有用课程。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多