我尝试使用Java Config 在Spring中注册HandlerInterceptor
的实例,而不使用扩展WebMvcConfigurationSupport
。我正在创建一个带有注释的库,当添加到@Configuration
类时,它会注册一个处理安全注释的拦截器。
我有一个使用WebMvcConfigurationSupport#addInterceptors
的实现,但是在春天与其他自动工作冲突,并覆盖了一些应用程序自己的逻辑。对于应该简单的事情来说,它似乎也非常沉重。我现在正在尝试:
@Configuration
public class AnnotationSecurityConfiguration {
@Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;
@PostConstruct
public void attachInterceptors() {
requestMappingHandlerMapping.setInterceptors(new Object[] {
new SecurityAnnotationHandlerInterceptor()
});
}
}
但是,似乎拦截器注册了一个完全不同的RequestMappingHandlerMapping
实例,而不是应用程序实际用于Web请求的实例。此外,当我作为BeanFactoryPostProcessor
实施时,当我尝试NullPointerException
HealthMvcEndpoint
中获得beanFactory.getBean(RequestMappingHandlerMapping.class)
答案 0 :(得分:9)
修改:此类已被弃用。有关Spring 5的等效内容,请参阅下面的@bosco answer。
想出来,解决方案就是使用,简单地说:
@Configuration
public class AnnotationSecurityConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SecurityAnnotationHandlerInterceptor());
}
}
在spring boot中,会自动检测WebMvcConfigurer
类型的所有bean,并可以修改MVC上下文。
答案 1 :(得分:7)
刚刚陈述@ Blauhirn的评论,as stated here:
自5.0
WebMvcConfigurer
不推荐使用默认方法(由Java 8基线实现),可以直接实现,无需此适配器
请参阅新方法:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCustomInterceptor())
// Optional
.addPathPatterns("/myendpoint");
}
}
另外,keep Spring Boot auto configuration for MVC,如果您想{{3}},请不要使用@EnableWebMvc
对此进行注释。