Register Spring HandlerInterceptor Without WebMvcConfigurati



我正在尝试使用 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 上下文。

相关内容

  • 没有找到相关文章

最新更新