在没有WebMvcConfigurationSupport的情况下注册Spring HandlerInterceptor

我正在尝试使用Java Config在Spring中注册HandlerInterceptor的实例而不扩展WebMvcConfigurationSupport 。 我正在创建一个带有注释的库,当添加到@Configuration类时,它会注册一个处理安全注释的拦截器。

我有一个使用WebMvcConfigurationSupport#addInterceptors的实现,但是在spring与其他自动工作冲突,并覆盖了一些应用程序自己的逻辑。 对于应该简单的事情来说,它似乎也非常沉重。 我现在正在尝试:

 @Configuration public class AnnotationSecurityConfiguration { @Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping; @PostConstruct public void attachInterceptors() { requestMappingHandlerMapping.setInterceptors(new Object[] { new SecurityAnnotationHandlerInterceptor() }); } } 

但是,似乎拦截器注册的RequestMappingHandlerMapping实例与应用程序实际用于Web请求的实例完全不同。 另外,当我实现为BeanFactoryPostProcessor ,当我尝试beanFactory.getBean(RequestMappingHandlerMapping.class)时,我在HealthMvcEndpoint得到一个NullPointerException

编辑 :此类已被弃用。 请参阅下面的@bosco答案 ,了解Spring 5的等价物。

弄清楚,解决方案是使用,简单地说:

 @Configuration public class AnnotationSecurityConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SecurityAnnotationHandlerInterceptor()); } } 

在spring boot中,将自动检测WebMvcConfigurer类型的所有bean,并可以修改MVC上下文。

刚刚说明@ Blauhirn的评论, 从版本5.0开始 , WebMvcConfigurerAdapter已被弃用 :

自5.0 WebMvcConfigurer不推荐使用WebMvcConfigurer具有默认方法(由Java 8基线实现)并且可以直接实现而无需此适配器

请参考新方法:

 @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyCustomInterceptor()) // Optional .addPathPatterns("/myendpoint"); } } 

另外, 如此处所述 ,如果要保留MVC的Spring Boot自动配置 ,请不要使用@EnableWebMvc对此进行注释。