問題描述
SpringBoot Web項(xiàng)目中如果自定義了WebMvcConfig extends WebMvcConfigurationSupport
遇到如下問題:
- Jackson框架日期輸出無法按照配置的格式進(jìn)行格式化,而是轉(zhuǎn)化為long型的值。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- 如果有自定義Serializer的實(shí)現(xiàn),也出現(xiàn)了無法被調(diào)用的情況。
@JsonComponent
public class CustomRowIDSerializer extends JsonSerializer<RowId> {
@Override
public void serialize(RowId rowid, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(rowid.toString());
}
}
解決方案
以上問題暫時(shí)不知道什么原因引起的。但是發(fā)現(xiàn)如果去掉WebMvcConfig ,問題就消失了。
總結(jié)問題現(xiàn)象:一旦存在WebMvcConfig ,那么SpringBoot默認(rèn)有關(guān)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());
});
}