拦截器配置类使用继承写法导致jackson的全局配置失效

问题描述

项目中需要一个拦截器用于拦截请求,在没有请求中生成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的全局配置。

点赞