使用java配置的现有请求映射的拦截器

时间:2017-04-08 16:08:58

标签: java spring-mvc spring-4

我有一个扩展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的Controller)。

当我调用不存在的资源时,例如/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的配置的情况下,它具有空的adopIterceptor。

编辑2:

示例应用程序的完整源代码(我试图让它尽可能小,只是为了演示效果): https://github.com/szprutamich/spring-demo

在课程ConfigurationBase中 - 可以使用静态字段CONFIG将配置从基于xml的配置切换到基于java的配置。

使用基于xml的配置,两个网址都有效:

/api/sample
/api/forward/sample

使用基于java的配置转发不起作用。

1 个答案:

答案 0 :(得分:3)

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

<default-servlet-handler xmlns="http://www.springframework.org/schema/mvc" /> 这为所有请求声明了一个默认处理程序,如果找到一个有效的处理程序,请求拦截器就会起作用。删除此行,您将在XML和Java配置中获得相同的行为:将找不到默认处理程序,拦截器将无法工作。

因此,对于拦截器来处理Java配置中的所有请求,您必须声明一个默认处理程序。你可以覆盖configureDefaultServletHandling,但是不能在它上面配置拦截器。您可能必须在默认处理控制器中明确映射/**