2017-04-08 87 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