攔截器配置類使用繼承寫法導致jackson的全局配置失效,採用配置類實現WebMvcConfigurer介面解決問題 ...
問題描述
項目中需要一個攔截器用於攔截請求,在沒有請求中生成requestId。然後寫了一個配置類,這個類繼承了 WebMvcConfigurationSupport類,重寫了addInterceptors 方法,來實現攔截器的註冊。正當一切順利的時候,我發現我jackson的全局配置失效了。
該配置類的寫法
@Configuration
public class MvcInterceptorConfig extends WebMvcConfigurationSupport {
@Resource
private RequestContextInterceptor requestContextInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(requestContextInterceptor).addPathPatterns("/api/**");
super.addInterceptors(registry);
}
}
原因
後來通過一系列的搜索,發現別人也有和我一樣的問題
第一篇文章可以參考這個: https://www.cnblogs.com/anemptycup/p/11313481.html。我意識到可能是我攔截器配置導致的問題。
資料上講,自定義WebMvcConfigur之後,原有properties中的jackson配置會失效。所以必須在自定義實現類中再次對jackson的配置進行補充。查詢資料的過程中,看到有的文章提到需要將註解@EnableWebMvc去掉。但是我們的項目中並不顯式的包含這個註解,相信可能有部分人跟我一樣在看到這個解決方案時並不知道如何對項目進行更改
解決
既然是因為自定義WebMvcConfigur導致的問題,那我不自定義WebMvcConfigur,有沒有其它註冊攔截器的方法呢? 顯然是有的。
另一種註冊攔截器的方法。寫一個配置類,實現WebMvcConfigurer介面也可以實現註冊攔截器
@Configuration
public class MvcInterceptorConfig implements WebMvcConfigurer {
@Resource
private RequestContextInterceptor requestContextInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(requestContextInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/static/**");
}
}
採用新的攔截器註冊方法否,成功實現攔截器註冊,和Jackson的全局配置。