我正在尝试使用 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
只是说明@Blauhirn的评论,WebMvcConfigurerAdapter
从版本 5.0 开始被弃用:
从 5.0 开始不推荐使用
WebMvcConfigurer
具有默认方法(通过 Java 8 基线实现),并且无需此适配器即可直接实现
请参阅执行此操作的新方法:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCustomInterceptor())
// Optional
.addPathPatterns("/myendpoint");
}
}
另外,如此处所述,如果您想保留 MVC 的 Spring 引导自动配置,请不要用 @EnableWebMvc
注释它。
编辑:这个类已经被弃用了。请参阅下面的答案@bosco了解 Spring 5 等效项。
想通了,解决方案就是简单地使用:
@Configuration
public class AnnotationSecurityConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SecurityAnnotationHandlerInterceptor());
}
}
在 Spring 引导中,会自动检测所有类型 WebMvcConfigurer
的 bean,并且可以修改 MVC 上下文。