【问题标题】:Spring MVC Interceptors stop working when mixing annotations混合注释时 Spring MVC 拦截器停止工作
【发布时间】:2014-07-25 08:36:49
【问题描述】:

我有一个停止支持 IE 7 的网络应用程序。为了通知用户这一变化,我们有一个 Spring MVC HandlerInterceptorAdapter 负责将用户重定向到一个警告 URL。

这是相关的部署描述符(web.xml)内容:

<servlet>
    <servlet-name>springServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/web-servlet.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

这个应用程序只使用了老式的 Spring MVC 控制器,即没有注释;最近我不得不使用以下 XML 使用注释来配置控制器:

<beans>
    <!-- ... -->
    <!-- A lot of beans and controllers using Classic Spring MVC -->

    <bean id="browserVersionInterceptor" class="...BrowserVersionInterceptor" />

    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="detectHandlersInAncestorContexts" value="true" />
        <property name="interceptors">
            <list>
                <ref bean="browserVersionInterceptor" />
            </list>
        </property>
    </bean>
    <beans>
        <context:annotation-config />      
        <bean id="mvcAnnotationConfig"
        class="....MvcAnnotationConfig">
        </bean>
    </beans>
</beans>

在该配置中,我为控制器设置了组件扫描:

@Configuration
@EnableWebMvc
@ComponentScan("package.to.controllers")
public class MvcAnnotationConfig {
    //...not much here
}

应用此更改后,我发现文件上一部分中声明的拦截器都不起作用。

以及新创建的带有注释的控制器:

@Controller
@RequestMapping("/Tickets.html")
public class SupportProcessController {

    @RequestMapping(method = GET)
    public ModelAndView show() {...}

    @ResponseBody
    @RequestMapping(method = POST, produces = "application/json")
    public Object apply() {...}
}

你知道为什么会这样吗?

【问题讨论】:

  • 你使用什么类来加载上下文配置?
  • XML 由 Spring 的 DispatcherServlet 加载
  • 我认为默认的ApplicationContext 类是XmlWebApplicationContext,我认为它不能处理@Configuration bean。
  • 好,所以这是不可能的。让我们看看你的 web.xml 和任何其他相关的上下文。
  • 您在控制器中使用了哪些注释?你的拦截器是如何声明的?

标签: java spring spring-mvc


【解决方案1】:

如果您的控制器是使用 @ComponentScan 注释声明的,您可以尝试在 xml 配置中使用 &lt;mvc:interceptors&gt; 块。类似的东西:

<mvc:interceptors>
    <ref bean="browserVersionInterceptor"/>
</mvc:interceptors>

但也要阅读文档...

【讨论】:

  • 有趣的是,它的工作原理......但问题仍然是,一旦我将新的 块放入 XML 中,为什么它们被禁用。
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多