【Spring Boot】@JsonField注解格式化日期数据失效

匿名 (未验证) 提交于 2019-12-02 23:03:14
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013034223/article/details/85243166

【问题背景】

昨天在联调日志列表,前端显示的日期都是时间戳格式,因为后端数据库定义的datetime类型,实体定义的date类型,以json格式返回给前端后,日期都格式化为long类型的时间戳。一看这个问题,就想到上一篇博客总结的@JsonField注解,直接利用format格式化一下,但实际情况是并没有转换。

【问题截图】

使用@JsonField字段,给前端返回的结果,还是时间戳格式。

【解决过程】

  1. 注解替换


  1. 搜索排查

使用@JsonFormat注解可以,而使用@JsonField注解不行,就开始查两个注解的区别,过程中查到一篇文章写的是@JsonFormat、@JSONField、@DateTimeFormat的使用以及其区别,其实两个注解都是可以实现日期数据格式化的,所以并不是注解使用不对的问题。紧接着换了个问题排查思路,直接查的是@JsonField注解失效原因,在这过程中,查到的更多的文章是@JsonFormat失效,但也是使用spring boot项目使用@JsonFormat无效问题这篇文章,让我找到了真正的原因。

  1. 真正原因

在springboot项目中,默认集成的是jackson解析json数据,并且会增加一些对应的配置,而正好,项目中也是增加了一些jackson的配置转换,代码如下:

    @Override     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {         MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();         ObjectMapper objectMapper = new ObjectMapper();         /**          * 序列换成json时,将所有的long变成string 因为js中得数字类型不能包含所有的java long值          */         SimpleModule simpleModule = new SimpleModule();         simpleModule.addSerializer(Long.class, ToStringSerializer.instance);         simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);         objectMapper.registerModule(simpleModule);         jackson2HttpMessageConverter.setObjectMapper(objectMapper);         converters.add(jackson2HttpMessageConverter);     } 

所以,我使用@JsonFormat注解是可以将后台返回的数据格式化成对应的日期格式的。为了验证@JsonField注解也可以格式化数据,我将配置改成了阿里的fastjson,代码如下:

    @Override     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 	    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();         FastJsonConfig fastJsonConfig = new FastJsonConfig();         fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);         // 处理中文乱码问题         List<MediaType> fastMediaTypes = new ArrayList<>();         fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);         fastConverter.setSupportedMediaTypes(fastMediaTypes);         fastConverter.setFastJsonConfig(fastJsonConfig);         converters.add(fastConverter);     } 

实体上用对应的@JsonField注解进行格式化:

    @JSONField(format = "yyyy-MM-dd HH:mm:ss")     private Date createTime; 

结果和使用@JsonFormat注解一样。

  1. 时区问题

在此过程中,正好看到了使用@JsonFormat注解会有8小时时差问题,原因是没有设置时区。

@JsonFormat注解的用法:

在属性值上 @JsonFormat(pattern=”yyyy-MM-dd”,timezone=”GMT+8”),如果直接使用 @JsonFormat(pattern=”yyyy-MM-dd”)就会出现2018-08-01 08:00:00的情况, 会相差8个小时,因为我们是东八区(北京时间)。所以我们在格式化的时候要指定时区(timezone )

【总结】

多思考几个为什么,总是会有收获的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!