1. 程式人生 > >springboot2.0版本配置自定義攔截器 WebMvcConfigurationSupport WebMvcConfigurer WebMvcConfigurerAdapter的坑

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<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);
    }

}

即可以解決這個坑