提问者:小点点

用于不存在具有java配置的请求映射的侦听器


我有一个配置类,它扩展了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的配置转发不起作用。


共1个答案

匿名用户

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

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