问题描述
SpringBoot Web项目中如果自定义了WebMvcConfig extends WebMvcConfigurationSupport
遇到如下问题:
- Jackson框架日期输出无法按照配置的格式进行格式化,而是转化为long型的值。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- 如果有自定义Serializer的实现,也出现了无法被调用的情况。
@JsonComponent
public class CustomRowIDSerializer extends JsonSerializer<RowId> {
@Override
public void serialize(RowId rowid, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(rowid.toString());
}
}
解决方案
以上问题暂时不知道什么原因引起的。但是发现如果去掉WebMvcConfig ,问题就消失了。
总结问题现象:一旦存在WebMvcConfig ,那么SpringBoot默认有关Jackson的配置都失效了。
目前解决的办法如下:
在WebMvcConfig 中添加如下代码
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.stream().filter(c -> c instanceof MappingJackson2HttpMessageConverter).forEach(cvt -> {
MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter) cvt;
ObjectMapper objectMapper = converter.getObjectMapper();
//添加rowid序列化器
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(RowId.class, customRowIDSerializer);
objectMapper.registerModule(simpleModule);
/*objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//如果需要将null值输出为“”,取消这里的注释。
jsonGenerator.writeString("");
}
});*/
String dateFormat = ServerUtil.nvl(environment.getProperty("spring.jackson.date-format"), "yyyy-MM-dd HH:mm:ss");
objectMapper.setDateFormat(new SimpleDateFormat(dateFormat));
objectMapper.setTimeZone(TimeZone.getDefault());
});
}