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

Posted

技术标签:

【中文标题】在没有 WebMvcConfigurationSupport 的情况下注册 Spring HandlerInterceptor【英文标题】:Register Spring HandlerInterceptor Without WebMvcConfigurationSupport 【发布时间】:2015-03-16 19:28:50 【问题描述】:

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

【问题讨论】:

供参考,这是在spring-boot-starter-web 还尝试了BeanPostProcessor,效果与上述相同(拦截器永远不会被调用) 【参考方案1】:

只是陈述@Blauhirn 的评论,WebMvcConfigurerAdapter is deprecated as of version 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");
    


另外,as stated here,如果您想使用keep Spring Boot auto configuration for MVC,请不要使用@EnableWebMvc 对此进行注释。

【讨论】:

在我的答案中添加了更新以反映此更改。感谢您的更新。【参考方案2】:

编辑:此类已被弃用。请参阅下面的 @bosco answer 了解 Spring 5 等效项。

想通了,解决办法就是用,简单:

@Configuration
public class AnnotationSecurityConfiguration extends WebMvcConfigurerAdapter 

    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        registry.addInterceptor(new SecurityAnnotationHandlerInterceptor());
    


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

【讨论】:

sicne WebMvcConfigurerAdapter 在 spring 5 中已被弃用,可能应该使用 implements WebMvcConfigurer(未测试)

以上是关于在没有 WebMvcConfigurationSupport 的情况下注册 Spring HandlerInterceptor的主要内容,如果未能解决你的问题,请参考以下文章

Vue Prop 没有初始化器,也没有在构造函数中明确赋值

在 Facebook 上分享有时效果很好,有时效果不佳(没有标题、没有描述、没有缩略图)

在没有隐藏溢出的情况下,transitionend 事件在 FireFox 中没有持续触发

有没有办法在没有活动的情况下使用 Viewpager 实现 TabLayout?

有没有办法在没有大括号的 tsx typescript 代码中进行评论?

在没有库的情况下制作矩阵/在列表中没有任何内容的情况下插入嵌套列表