具有 java 配置的不存在请求映射的拦截器
Interceptor for not existing request mapping with java configuration
我有一个配置 class,它扩展了 WebMvcConfigurationSupport
并且我添加了这样的拦截器:
@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/sample
RequestMappingHandlerMapping
正在使用) 在基于 Java 配置的情况下具有空的 adoptedIterceptors。
编辑 2:
示例应用程序的完整源代码(为了演示效果,我尽量把它弄小了):
https://github.com/szprutamich/spring-demo
在 class ConfigurationBase
- 配置可以从基于 xml 切换到基于静态字段 CONFIG
.
的 java
使用基于 xml 的配置,两个 url 都有效:
/api/sample
/api/forward/sample
基于 java 的配置转发不起作用。
您的问题是关于 "not existing request mapping",但在您的 XML 配置中,它存在:
<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" />
这声明了所有请求的默认处理程序,如果找到有效的处理程序,请求拦截器就会工作。删除此行,您将在 XML 和 Java 配置中获得相同的行为:将找不到默认处理程序并且拦截器将不起作用。
因此,要让拦截器处理您 Java 配置中的所有请求,您必须声明一个默认处理程序。您可以覆盖 configureDefaultServletHandling
但据我所知,无法在其上配置拦截器。您可能必须在默认处理控制器中显式映射 /**
。
我有一个配置 class,它扩展了 WebMvcConfigurationSupport
并且我添加了这样的拦截器:
@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/sample
RequestMappingHandlerMapping
正在使用) 在基于 Java 配置的情况下具有空的 adoptedIterceptors。
编辑 2:
示例应用程序的完整源代码(为了演示效果,我尽量把它弄小了): https://github.com/szprutamich/spring-demo
在 class ConfigurationBase
- 配置可以从基于 xml 切换到基于静态字段 CONFIG
.
使用基于 xml 的配置,两个 url 都有效:
/api/sample
/api/forward/sample
基于 java 的配置转发不起作用。
您的问题是关于 "not existing request mapping",但在您的 XML 配置中,它存在:
<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" />
这声明了所有请求的默认处理程序,如果找到有效的处理程序,请求拦截器就会工作。删除此行,您将在 XML 和 Java 配置中获得相同的行为:将找不到默认处理程序并且拦截器将不起作用。
因此,要让拦截器处理您 Java 配置中的所有请求,您必须声明一个默认处理程序。您可以覆盖 configureDefaultServletHandling
但据我所知,无法在其上配置拦截器。您可能必须在默认处理控制器中显式映射 /**
。