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

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

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {



    @Autowired
    private AuthorizationInterceptor authorizationInterceptor;

    @Autowired
    private CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List 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 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 argumentResolvers) {
        currentUserMethodArgumentResolver.setUserModelClass(Member.class);
        argumentResolvers.add(currentUserMethodArgumentResolver);
    }

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

}

即可以解决这个坑

你可能感兴趣的:(springboot)