SpringBoot 反序列化组件由Jackson 替换为FastJson

事情的起因是前端无法处理null值,要求将null值转化为空字符串,因此重写了Jackson的反序列化方法,如下

@Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
        serializerProvider.setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                    throws IOException {
                logger.warn(o instanceof String ? "String" : "Other");
                logger.warn("检测到反序列化内容为空{}", o);
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }

但是这样写因此带来了一个问题,非String类型的空值也一并给转换到了空字符串,造成了反序列化异常,因此需要重写。

于是顺手将Jackson替换成了FastJson

重写 HttpMessageConverters

    /**
     * 覆盖方法configureMessageConverters,使用fastJson
     *
     * @return
     */
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        fastJsonHttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8"));

        FastJsonConfig config = fastJsonHttpMessageConverter.getFastJsonConfig();
        config.setSerializeConfig(SerializeConfig.globalInstance);
        config.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullListAsEmpty,
//                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        );
        fastJsonHttpMessageConverter.setFastJsonConfig(config);

        //4、将convert添加到converters中
        HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
        return new HttpMessageConverters(converter);



方法二:(推荐)

@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //首先要把Jackson转换器删除
        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.remove(i);
            }
        }
        logger.warn("json converter from jackson to fastjson ");
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);

        FastJsonConfig config = fastJsonHttpMessageConverter.getFastJsonConfig();
        if (config == null) {
            config = new FastJsonConfig();
        }
        SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
        if (serializeConfig == null) {
            logger.warn("can not get serialize config, generate one ");
            serializeConfig = SerializeConfig.globalInstance;
        }
        config.setSerializeConfig(serializeConfig);
        config.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullBooleanAsFalse,
                SerializerFeature.WriteNullNumberAsZero
        );

        fastJsonHttpMessageConverter.setFastJsonConfig(config);
        converters.add(fastJsonHttpMessageConverter);
    }


    private final Logger logger = LoggerFactory.getLogger(CustomWebMvcConfigurer.class);
}
上一篇
下一篇