如何用spring mvc 3.0注册处理程序拦截器?

应该很容易:

       

但这样就不会调用拦截器。

默认情况下,Spring将注册BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping ,而不需要任何显式配置。

如果您定义了自己的HandlerMapping bean,那么默认的将不会被注册,您只需获得明确声明的bean。

到现在为止还挺好。

到混合时会出现问题。 这声明了自己的DefaultAnnotationHandlerMapping ,它取代了默认值。 但是,如果您也声明自己的那个,那么最终会有两个。 由于它们是按声明的顺序查询的,这通常意味着首先调用注册的那个,然后忽略你自己的那个。

如果由注册的DefaultAnnotationHandlerMapping像默认值一样运行会更好,即如果显式声明的那些优先,但这不是他们编写它的方式。

我目前的偏好是根本不使用 ,它太混乱了,与其他配置选项混合时太不可预测了。 它并没有真正做任何特别复杂的事情,明确添加它为你做的事情并不困难或冗长,最终结果更容易理解。

我遇到的问题 :Spring MVC标记与DefaultAnnotationHandlerMapping的自定义定义不相符。

为什么..? 原因在上面的答案中得到了很好的解释。

为什么我要使用DefaultAnnotationHandlerMapping ? 我想为我的每个请求定义一个拦截器。 一个Spring-Mobile拦截器来确定USER AGENT..mobile或浏览器?

现在由于mvc-annotationDefaultAnnotationHandlerMapping的这种冲突,我不能再使用DefaultAnnotationHandlerMapping了。 问题归结为我如何用标签注册我的拦截器。

解决方案很简单……但很难找到。 发布它以便对其他解决方案寻求者有所帮助。使用标记并在dispathcer-servlet.xml 示例中注册拦截器bean:

     

此行为的原因是应用程序上下文中存在两个类型为org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping bean。 Spring解决了这两个问题,但只问第一个拦截器。 要解决此问题,应将以下init参数设置为DispatcherServlet

  detectAllHandlerMappings false  

这使得调度程序servlet仅使用x-servlet.xml定义的handlerMapping

除此之外,为什么这是默认行为。 我期待着spring社区的回答。

在我的情况下,我无法摆脱因为我使用jackson为json支持使用注释。

我尝试了什么,将我的所有拦截器到单独的“xml”文件(interceptor-config.xml)中并从我的x-dispatcher-servlet.xml导入它

  

它解决了我的问题,并避免默认的’DefaultAnnotationHandlerMapping’bean我的应用程序上下文。

您可以直接在’x-dispatcher-servlet.xml’中复制/粘贴拦截器内容,而不是创建单独的’xml’。

以下是我的拦截器:

         

在Spring MVC 3.0中,您可以使用而不是手动定义处理程序映射。