我有一个配置类,它扩展了WebMvcConfigurationSupport
,我添加了如下拦截器:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()).addPathPatterns("/api/**");
}
其中myInterceptor()
是:
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
它适用于我已经实现的任何映射(/api/**
),例如/api/示例
-MyIntericetor的preHandle被触发(我有一个带有映射/api/示例
的控制器)。
当我调用不存在的资源时,例如/api/前向/示例
来自MyIntericetor的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/sample
RequestMappingHandlerMapping
正在使用中),在基于 Java 的配置的情况下,它有空的采用Iterceptors。
编辑2:
示例应用程序的完整源代码(为了演示效果,我试图让它尽可能小):https://github.com/szprutamich/spring-demo
在< code>ConfigurationBase类中,可以使用静态字段< code>CONFIG将配置从基于xml切换到基于java。
使用基于xml的配置,两个url都可以工作:
/api/sample
/api/forward/sample
基于java的配置转发不起作用。
您的问题是关于“不存在的请求映射”,但是在您的XML配置中,它存在:
因此,要使拦截器处理 Java 配置中的所有请求,您必须声明一个默认处理程序。你可以覆盖configureDefaultServletHandling
,但不能在其上配置拦截器。您可能必须在默认处理控制器中显式映射 /**
。