SpringBoot 自定义WebMvcConfig有关Jackson的问题

问题描述

SpringBoot Web项目中如果自定义了WebMvcConfig extends WebMvcConfigurationSupport
遇到如下问题:

  • Jackson框架日期输出无法按照配置的格式进行格式化,而是转化为long型的值。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
  • 如果有自定义Serializer的实现,也出现了无法被调用的情况。
@JsonComponent
public class CustomRowIDSerializer extends JsonSerializer {

    @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> 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() {
                @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());
        });
    }






你可能感兴趣的:(SpringBoot 自定义WebMvcConfig有关Jackson的问题)