[alibaba/fastjson]Springboot 2中配置默认使用fastjson,但Controller返回实体时并没有完全生效。

2025-10-29 704 views
1

我在Springboot项目中,使用@Configuration的方式配置使用fastjson作为默认的json工具。 `@Configuration public class FastJsonConfiguration implements WebMvcConfigurer {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(SerializerFeature.WriteNullListAsEmpty, // List类型字段为null时输出[]而非null
            SerializerFeature.WriteMapNullValue, // 显示空字段
            SerializerFeature.WriteNullStringAsEmpty, // 字符串类型字段为null时输出""而非null
            SerializerFeature.WriteNullBooleanAsFalse, // Boolean类型字段为null时输出false而null
            SerializerFeature.PrettyFormat, // 美化json输出,否则会作为整行输出
            SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
            SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null,输出为false,而非null
            SerializerFeature.WriteDateUseDateFormat, // 时间格式yyyy-MM-dd HH: mm: ss
            SerializerFeature.DisableCircularReferenceDetect);  // 禁用循环引用检测
    converter.setFastJsonConfig(config);
    converters.add(0,converter);
    List<MediaType> supportedMediaTypes = new ArrayList<>();
    supportedMediaTypes.add(MediaType.APPLICATION_JSON);
    supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
    supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
    supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
    supportedMediaTypes.add(MediaType.APPLICATION_PDF);
    supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
    supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
    supportedMediaTypes.add(MediaType.APPLICATION_XML);
    supportedMediaTypes.add(MediaType.IMAGE_GIF);
    supportedMediaTypes.add(MediaType.IMAGE_JPEG);
    supportedMediaTypes.add(MediaType.IMAGE_PNG);
    supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
    supportedMediaTypes.add(MediaType.TEXT_HTML);
    supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
    supportedMediaTypes.add(MediaType.TEXT_PLAIN);
    supportedMediaTypes.add(MediaType.TEXT_XML);
    converter.setSupportedMediaTypes(supportedMediaTypes);
}

}`

但是,Controller返回实体时并没有按照配置里设置的SerializerFeature去执行。 比如我把上面代码中SerializerFeature.PrettyFormat注释掉, 依然不会把返回结果显示为一行。 再比如SerializerFeature.WriteNullStringAsEmpty时,字符串依然是null。

是我理解的有错吗?难道Controller中以Model作为返回结果时没按这个设置去转换?

Springboot版本:2.1.2 RELEASE FastJson版本:1.2.56

回答

2

重写实现HttpMessageConverters这个Bean即可,下面的供参考。

@Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        //1.需要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2:添加fastJson的配置信息;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();

         //第一个SerializerFeature.PrettyFormat可以省略,毕竟这会造成额外的内存消耗和流量,第二个是用来指定当属性值为null是是否输出:pro:null
         //SerializerFeature.SkipTransientField
        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);
        // fastJsonConfig.setSerializerFeatures(SerializerFeature.SkipTransientField);
        //3处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
        return new HttpMessageConverters(converter);
    }
3

重写实现HttpMessageConverters这个Bean即可,下面的供参考。

@Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        //1.需要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2:添加fastJson的配置信息;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();

         //第一个SerializerFeature.PrettyFormat可以省略,毕竟这会造成额外的内存消耗和流量,第二个是用来指定当属性值为null是是否输出:pro:null
         //SerializerFeature.SkipTransientField
        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);
        // fastJsonConfig.setSerializerFeatures(SerializerFeature.SkipTransientField);
        //3处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
        return new HttpMessageConverters(converter);
    }

非常感谢您的回答,这个方法确实能解决问题。赞! 但我还是好奇configureMessageConverters为何不生效。 再次表示感谢~

7

fastjson 较新版本中的 FastJsonHttpMessageConverter4 又过期了诶,都推荐使用 FastJsonHttpMessageConverter 了。