事情的起因是前端无法处理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);
}