如何用spring mvc 3.0注册处理程序拦截器?
应该很容易:
但这样就不会调用拦截器。
默认情况下,Spring将注册BeanNameUrlHandlerMapping
和DefaultAnnotationHandlerMapping
,而不需要任何显式配置。
如果您定义了自己的HandlerMapping
bean,那么默认的将不会被注册,您只需获得明确声明的bean。
到现在为止还挺好。
将
到混合时会出现问题。 这也声明了自己的DefaultAnnotationHandlerMapping
,它取代了默认值。 但是,如果您也声明自己的那个,那么最终会有两个。 由于它们是按声明的顺序查询的,这通常意味着首先调用
注册的那个,然后忽略你自己的那个。
如果由
注册的DefaultAnnotationHandlerMapping
像默认值一样运行会更好,即如果显式声明的那些优先,但这不是他们编写它的方式。
我目前的偏好是根本不使用
,它太混乱了,与其他配置选项混合时太不可预测了。 它并没有真正做任何特别复杂的事情,明确添加它为你做的事情并不困难或冗长,最终结果更容易理解。
我遇到的问题 :Spring MVC标记与DefaultAnnotationHandlerMapping的自定义定义不相符。
为什么..? 原因在上面的答案中得到了很好的解释。
为什么我要使用DefaultAnnotationHandlerMapping ? 我想为我的每个请求定义一个拦截器。 一个Spring-Mobile拦截器来确定USER AGENT..mobile或浏览器?
现在由于mvc-annotation和DefaultAnnotationHandlerMapping的这种冲突,我不能再使用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中,您可以使用
而不是手动定义处理程序映射。