2017-04-08 135 views
9

我有一个配置类,它扩展WebMvcConfigurationSupport和我已经加入拦截器是这样的:拦截器用于与Java配置不存在请求映射

@Override 
public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(myInterceptor()).addPathPatterns("/api/**"); 
} 

其中myInterceptor()是:

@Bean 
public MyInterceptor myInterceptor() { 
    return new MyInterceptor(); 
} 

和它的工作原理罚款的任何映射(/api/**),我已经实施例如/api/sample - 从MyInterceptor preHandle被解雇(我有一个控制器与映射/api/sample)。

当我打电话不存在资源例如/api/forward/sample从MyInterceptor preHandle永远不会被调用。

请注意它的工作时,我曾在配置XML,像预期:

<mvc:interceptors> 
    <mvc:interceptor> 
     <mvc:mapping path="/api/**" /> 
     <bean class="my.pack.MyInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

出于某种原因,与Java的配置要求为不存在的映射不会拦截。为什么配置不等效?我认为它应该是。

编辑:

多一点的调试信息。使用XML配置DispatcherServlet#handlerMappings包含5个处理:

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 
org.springframework.web.socket.server.support.WebSocketHandlerMapping 
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 
org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping 
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping 

与Java配置中,包含7个处理器:

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 
org.springframework.web.socket.server.support.WebSocketHandlerMapping 
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 
org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping 
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping 
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping 
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping 

这个问题似乎是与SimpleUrlHandlerMapping(至少它似乎是用于我所说的资源 - api/forward/sample,而api/sampleRequestMappingHandlerMapping正在使用中),在基于Java的配置的情况下,它具有空的已采用的接受器。

编辑2:

作为样品施加

完整的源代码(I试图使它尽可能小只是为了演示的效果): https://github.com/szprutamich/spring-demo

ConfigurationBase类 - 构型可以切换从基于xml的到基于静态字段的java CONFIG

与基于XML配置两个URL工作:

/api/sample 
/api/forward/sample 

与Java配置着不起作用。

+0

你可以分享传递的URL和相关的web.xml片段吗? – VinPro

+0

请检查我最后的编辑。让我知道你是否需要知道其他事情。 – maszter

回答

3

你提的问题是关于“不存在请求映射”,但在你的XML配置,它的存在:

<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" /> 这声明所有请求的默认处理程序,如果有效的处理程序的请求拦截ONY作品被发现。删除此行,您将在XML和Java配置中获得相同的行为:不会找到默认处理程序,并且拦截器不起作用。

因此,要使拦截器能够在Java配置中的所有请求上工作,您必须声明一个默认处理程序。您可以覆盖configureDefaultServletHandling,但afaik无法在其上配置拦截器。您可能必须在默认处理控制器中明确映射/**

+0

我有: @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){0} {0} {0}配置。 } 应该这样做。 – maszter

+0

http://stackoverflow.com/questions/5062586/equivalent-of-mvcdefault-servlet-handler-in-spring-annotation-based-configurati – maszter

+2

问题是,这不会自动添加拦截器,不像XML对应。你可以提供你自己的默认处理程序,然后使用getMapping()。addInterceptor,但它是过度的imho,只是地图/ **,它会工作。 – KeatsPeeks