【问题标题】:How to call Spring MVC controller within Framework?如何在框架内调用 Spring MVC 控制器?
【发布时间】:2012-05-20 06:35:29
【问题描述】:

在我的 Spring 项目中,我确实有一个 JMS 消息侦听器,由 spring 管理:

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="tcp://localhost:61616"/>

<bean id="simpleExampleListener" class="my.package.ExampleListener" />

<jms:listener-container container-type="default" connection-factory="jmsFactory" acknowledge="auto" concurrency="1-3">
    <jms:listener destination="TEST.FOO" ref="simpleExampleListener" method="onMessage"/>
</jms:listener-container>

在一个特定的消息上,我需要调用一个 Spring MVC 控制器,它是请求范围的(实际上目标是调用一个服务,它也是请求范围并被控制器调用)。所以我不能直接从侦听器中执行此操作,因为 Spring 根据需要管理它们并且它们不受请求范围限制(因为我无法通过 @AutowireApplicationContext 访问控制器)。一种解决方案可能是通过我的控制器映射的带有 Rest Template 到 URL 的 HTTP 调用。但是,我认为这是一种开销,所以也许还有其他方法可以避免 HTTP 协议开销并在 Spring MVC 框架内调用 Controller?

【问题讨论】:

  • 你可以使用原型范围,而不是请求范围吗?
  • 如果您确实进行了 Http 调用,至少这将与 webapp 代码松散耦合。直接调用控制器就丑多了。
  • 你能解释一下为什么你想从消息监听器调用控制器吗?我想不出任何用例......
  • @Nathan Hughes:实际上,目标是调用由控制器调用的服务(也是请求范围的),因此可以跳过控制器并直接调用服务,这样就不会再丑陋了...
  • 同意。所以打电话给服务,问题解决了^_^

标签: spring spring-mvc jms spring-jms


【解决方案1】:

您需要质疑为什么将服务类定义为请求范围——理想情况下,服务层不应该对 Web 层有任何隐式/显式依赖。如果这不在您的控制范围内,您可以使用以下解决方法。您将需要添加 spring-test.jar 作为依赖项。

    class Listener {

    @Autowired
    RequestScopedService requestScopedService;


    void handle() {
        MockHttpServletRequest request = new MockHttpServletRequest();
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
        try {
             requestScopedService.callSomeMethod();
        } finally {
             ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
             RequestContextHolder.resetRequestAttributes();
        }

如果服务 bean 配置了&lt;aop:scoped-proxy/&gt; 标签,那么它可以被自动装配。否则,您需要获取应用程序上下文(通过实现 ApplicationContextAware)并进行查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2011-12-31
    • 2013-04-23
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多