美文网首页SpringBoot学习与总结
SpringBoot 自定义WebMvcConfig有关Jack

SpringBoot 自定义WebMvcConfig有关Jack

作者: 花绽放水流年 | 来源:发表于2017-06-23 14:07 被阅读189次

    问题描述

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

    相关文章

      网友评论

      • JimmyGan:遇到同样的问题,纠结了很久

      本文标题:SpringBoot 自定义WebMvcConfig有关Jack

      本文链接:https://www.haomeiwen.com/subject/emdccxtx.html