springboot2.0版本配置自定义拦截器 WebMvcConfigurationSupport WebMvcConfigurer WebMvcConfigurerAdapter的坑

在SpringBoot 2.0项目中配置自定义拦截器时,遇到WebMvcConfigurerAdapter已过时的问题。由于Java8接口的默认实现,选择继承WebMvcConfigurationSupport会导致静态资源和Controller无法访问。原因是@EnableWebMvc注解导致默认配置失效。解决方案是直接实现WebMvcConfigurer接口并重写所需方法,以此避免启用@EnableWebMvc带来的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中想添加自定义的拦截器,一开始通过配置继承WebMvcConfigurerAdapter如:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {



    @Autowired
    private AuthorizationInterceptor authorizationInterceptor;

    @Autowired
    private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        currentUserMethodArgumentResolver.setUserModelClass(Member.class);
        argumentResolvers.add(currentUserMethodArgumentResolver);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor);
    }

}

但是根据官方标注WebMvcConfigurerAdapter过时了,因为java8接口具有默认实现,然后想通过继承WebMvcConfigurationSupport实现添加。


@Configuration
public class WebConfig extends WebMvcConfigurationSupport {



    @Autowired
    private AuthorizationInterceptor authorizationInterceptor;

    @Autowired
    private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        currentUserMethodArgumentResolver.setUserModelClass(Member.class);
        argumentResolvers.add(currentUserMethodArgumentResolver);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor);
    }

}

但是当启动项目后,发现无法访问静态资源,已经controller都无法访问,因为在springboot中默认是加载了mvc的配置,可以查看注释@WebMvcAutoConfiguration,这个注释有一个条件注释@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)。也就是说只要在容器中发现有WebMvcConfigurationSupport这个类,那就会失效,我们就必须在我们的主类上添加@@EnableWebMvc注解,这样我就无法访问默认的静态资源了。因为WebMvcConfigurerAdapter过时,是因为java8中接口有默认实现,而WebMvcConfigurerAdapter实现的就是WebMvcConfigurer方法,所以我只要实现WebMvcConfigurer接口,然后重写我们需要的方法即可。最终代码:

@Configuration
public class WebConfig implements WebMvcConfigurer {



    @Autowired
    private AuthorizationInterceptor authorizationInterceptor;

    @Autowired
    private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        currentUserMethodArgumentResolver.setUserModelClass(Member.class);
        argumentResolvers.add(currentUserMethodArgumentResolver);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor);
    }

}

即可以解决这个坑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值