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

时间:2015-01-18 19:11:35

标签: java spring spring-mvc

我尝试使用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)

2 个答案:

答案 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对此进行注释。