springboot2.0版本配置自定義攔截器 WebMvcConfigurationSupport WebMvcConfigurer WebMvcConfigurerAdapter的坑
阿新 • • 發佈:2019-01-24
專案中想新增自定義的攔截器,一開始通過配置繼承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);
}
}
即可以解決這個坑