1

我继承了一个通过两个渠道提供类似服务的代码库:

  1. REST/HTTP - 由带注释的 Spring 控制器处理
  2. JMS - 由消息驱动的 POJO 处理

两个通道上的消息结构或多或少相似,因此控制器和 JMS 侦听器中有很多冗余/重复的处理逻辑。解决此问题的一种方法是将通用逻辑提取到另一个组件中,并将该组件注入到@Controller 和 JMS 侦听器中。

可以说我现在没有时间这样做。有没有一种方法可以将控制器注入 JMS 侦听器并调用相同的控制器方法,这些方法在 REST 请求到达时由 Spring 的调度程序 servlet 自动调用。由于控制器没有 XML 配置,我如何获取其参考以注入 JMS 侦听器?我不想创建另一个具有不同“id”的控制器 bean。

4

1 回答 1

2

解决这个问题的一种方法是提取通用逻辑

这不是“一种方式”,而是唯一的方式。不仅因为将控制器注入 JMS 消息侦听器是您可以对架构做的最尴尬的事情之一。但也因为 Spring 本身不会让你这样做。

在 Spring MVC 中实际上有两个上下文:主要的一个(声明 JMS 侦听器的地方)和DispatcherServlet(MVC)上下文。后者是前者的子代,这意味着它可以从主上下文访问 bean(否则将无法访问控制器中的服务和 DAO),但反之则不行。

可以说我现在没有时间这样做

您当前的架构相当糟糕的事实并不能证明让它变得更糟是合理的。过去可能一些开发人员没有时间提取通用逻辑,因此出现了重复。现在你想引入从 JMS 层到 Web 层的非常不寻常的依赖关系......我宁愿忍受重复。

由于控制器没有 XML 配置,我如何获得它的参考

仅作记录,如果您的控制器名为FooBarController,则:

@Resource
private FooBarController fooBarController;

可能有效,但幸运的是不是从父到子上下文。

于 2012-07-16T20:39:41.820 回答