具有 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/sampleapi/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 但据我所知,无法在其上配置拦截器。您可能必须在默认处理控制器中显式映射 /**