SpringBoot2 @JSONField失效问题的解决方法

  • A+
所属分类:SpringBoot

之前代码里@JSONField是没有问题的,过了几天没有管它,今天跑时发现@JSONField失效了。。百度google了半天也没有我想要的结果。看了最近的代码提交历史,也没有发现有影响的代码。

fastJson的配置代码如下:

@Bean//使用@Bean注入fastJsonHttpMessageConvert
public HttpMessageConverters fastJsonHttpMessageConverters(){
    //1.需要定义一个Convert转换消息的对象
    FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
    //2.添加fastjson的配置信息,比如是否要格式化返回的json数据

    FastJsonConfig fastJsonConfig=new FastJsonConfig();
    // 显示null值
    fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
    //3.在convert中添加配置信息
    fastConverter.setFastJsonConfig(fastJsonConfig);

    HttpMessageConverter<?> converter=fastConverter;
    return new HttpMessageConverters(converter);
}

 

无奈,只有通过还原代码到特定版本一个一个试了。最终发现有影响的代码是添加静态资源访问的一个类。代码如下:

但这个静态资源的配置按理说与fastJson没什么影响才对啊,看到WebMvcConfig,突然想起fastJosn还有一种配置方法,百度后,代码如下:

// 需要继承WebMvcConfigurerAdapter

@Override

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

super.configureMessageConverters(converters);
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);

fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);

}

@Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        super.configureMessageConverters(converters);
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat
        );

        fastConverter.setFastJsonConfig(fastJsonConfig);
        converters.add(fastConverter);

    }

 

我把fastJson的配置改成上面这种发现也不行。而且访问接口还会报错。

第一反应是这个静态资源的配置和fastJson的配置有冲突,一个是实现WebMvcConfigurer接口,一个是继承
WebMvcConfigurerAdapter 类。查了下发现
WebMvcConfigurerAdapter 这个类已经过时,springboot2.0应该实现
WebMvcConfigurer接口, 然后我看了下
WebMvcConfigurer接口的源码,发现里面也有configureMessageConverters这个方法。

这下原因就清楚了,因为静态资源的这个类没有重写
configureMessageConverters 这个方法,所以相当于是默认的,这个配置类加载时就把之前fastJson的配置给覆盖成默认的了。解决方法就是在这个类里重写
configureMessageConverters 即可。代码如下:

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    @Value("${tjzbk.upload.path}")
    private String static_save_path;

    /**
     * 上传资源路径访问配置
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/files/**").addResourceLocations(static_save_path);
    }


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
//                    // 防止循环引用
//                    SerializerFeature.DisableCircularReferenceDetect,
//                    // 空集合返回[],不返回null
//                    SerializerFeature.WriteNullListAsEmpty,
//                    // 空字符串返回"",不返回null
//                    SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteMapNullValue
        );
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);

        //处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);

        converters.add(fastJsonHttpMessageConverter);
    }
}

 

ZPY

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: