前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringMVC+GSON 对象序列化--日期格式的处理

SpringMVC+GSON 对象序列化--日期格式的处理

作者头像
用户2193479
发布于 2018-06-28 10:07:09
发布于 2018-06-28 10:07:09
2.5K00
代码可运行
举报
文章被收录于专栏:全栈全栈
运行总次数:0
代码可运行

Gson异常强大因此使用它代替了Jackson作为SpringMVC消息转换器。

在自己的项目中,发现对象在序列化后,日期格式出现了问题。

先看问题

在员工表中有一列是生日,字段类型为Date,也就是只存储到年月日,不带小时分秒,见下图数据库中的数据

前台列表向后台请求数据,然后在页面显示,可以看到,日期后面带有了小时分秒,而对于生日来说,这是没有意义的。见下图

问题出现在哪?

问题就出现在了 spring 的 message-converters 上,在我的项目中,配置的类型转换器为 google的 gson。可以看到全局配置为“yyyy-MM-dd HH:mm:ss:SSS” ,这是带有小时分秒的。所以当请求返回给浏览器的时候,spring会利用Gson将对象序列化输出到前端,按照配置的规则,就会带有小时分秒了。具体见下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--开启 spring-mvc注解-->
<mvc:annotation-driven>
    <!--设置JSON转换器为Gson-->
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/plain;charset=UTF-8</value>
                    <value>text/html;charset=UTF-8</value>
                </list>
            </property>
        </bean>
        <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/plain;charset=UTF-8</value>
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
            <property name="gson">
                <bean class="org.springframework.http.converter.json.GsonFactoryBean">
                    <property name="serializeNulls" value="true"/>
                    <property name="disableHtmlEscaping" value="true"/>
                    <property name="dateFormatPattern" value="yyyy-MM-dd HH:mm:ss:SSS" />
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

如何解决呢?

两种办法: 1、修改全局设置,将上述的配置修改yyyy-MM-dd。这样做有一个弊端:所有的日期处理都会受到影响。 2、利用@JsonAdapter注解,在想要特殊处理的属性上,添加该注解。

重点介绍第二种方式

首先,在要处理的属性上增加注解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@JsonAdapter(DateAdapter.class)
private Date birthday;

该注解接收一个参数,是类且继承TypeAdapter。要重写read(JsonReader in)、write(JsonWriter jsonWriter, Date date)这两个抽象方法。具体如下:

write是序列化、read是反序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.wt.common.core.adapter;

import com.google.gson.JsonSyntaxException;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.bind.util.ISO8601Utils;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @ProjectName: syInfo
 * @Package: com.wt.common.core.adapter
 * @Description: gson 日期适配器
 * @Author: lichking2017@aliyun.com
 * @CreateDate: 2018/5/5 上午11:12
 * @Version: v1.0
 */
public class DateAdapter extends TypeAdapter<Date>{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void write(JsonWriter jsonWriter, Date date) throws IOException {
        jsonWriter.value(sdf.format(date));
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        if(in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        } else {
            Date date = this.deserializeToDate(in.nextString());
            return date;
        }
    }

    private Date deserializeToDate(String s) {
        synchronized (sdf) {
            try {
                return sdf.parse(s);
            } catch (ParseException ignored) {}
            try {
                return sdf.parse(s);
            } catch (ParseException ignored) {}
            try {
                return ISO8601Utils.parse(s, new ParsePosition(0));
            } catch (ParseException e) {
                throw new JsonSyntaxException(s, e);
            }
        }
    }
}

OK!完事了,重启服务器查看效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC数据类型转换器与国际化配置
我们都知道在浏览器中,访问网页都是通过url访问的。所以在web开发中,我们经常会通过url来传递数据。如果我要在url参数上传递一个日期数据,我们是无法在后端通过声明一个Date类型的参数来接收的,会报空指针错误。想要接收日期数据,就得用到SpringMVC中的数据类型转换器了。
端碗吹水
2020/09/23
3860
SpringMVC数据类型转换器与国际化配置
Spring MVC-06循序渐进之Converter和Formatter
Spring MVC-05循序渐进之数据绑定和form标签库(上) 和 Spring MVC-05循序渐进之数据绑定和form标签库(下) 实战从0到1 我们已经学习了数据绑定,见识了数据绑定的方便性。
小小工匠
2021/08/17
9170
SpringMVC(五):SpringMVC的获取请求参数
DispatcherServlet中的service方法直接将此次请求的request对象传递给调用的单元方法即可。同时在单元方法上声明形参HttpServletRequest来接收request实参即可。
Lansonli
2022/12/27
7400
SpringMVC(五):SpringMVC的获取请求参数
java中的日期转换、springmvc接收前台的Date类型参数遇到的坑
前台jsp用的一个日期插件,后台获取一直有问题。 被这个问题搞了好久,其实很简单。记录下来,希望可以帮到遇到同样问题的同学。 我项目使用的ssm框架, 在做web开发的时候,页面传入的都是String类型,SpringMVC可以对一些基本的类型进行转换,但是对于日期类的转换可能就需要我们配置。 1、如果查询类是我们自己写,那么在属性前面加上@DateTimeFormat(pattern = "yyyy-MM-dd")  ,即可将String转换为Date类型,如下 @DateTimeFormat(pattern = "yyyy-MM-dd")   private Date createTime;    2、如果我们只负责web层的开发,就需要在controller中加入数据绑定:
sunonzj
2022/06/21
1.6K0
springMVC系列(八)——springMVC参数接收详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
1.4K0
springMVC系列(八)——springMVC参数接收详解
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
4.8K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
SpringMVC解决@ResponseBody返回Json的Date日期类型的转换问题
在做这个项目时,我发现后台返回了json字符串形式的日期属性,前台无法获得转换后的日期格式。
Erwin
2019/12/31
2.9K0
猿蜕变系列6——一文掌握springMVC必会技巧
看过之前的蜕变系列文章,相信你对springMVC有了一定的认识。对controller的花式编写,也有了一定的认识。今天我们来开启新的认识,讲一讲web开发中比较关键的东西,比如页面跳转,数据类型转换,以及数据校验。
山旮旯的胖子
2020/07/28
7690
猿蜕变系列6——一文掌握springMVC必会技巧
ssm整合之六 时间日期装换
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
张哥编程
2024/12/17
610
SpringMVC注解 @initbinder 解决类型转换问题
使用 SpringMVC 时,常遇到表单中日期字符串和 JavaBean 的 Date 类型的转换,而 SpringMVC 默认不支持这个格式的转换,故需要手动配置,自定义数据的绑定才能解决这个问题。 在需要日期转换的 Controller 中使用 SpringMVC 的注解 @initbinder 和 Spring 自带的 WebDateBinder 类来操作。 WebDataBinder 是用来绑定请求参数到指定的属性编辑器.由于前端传到 controller 里的值是 String 类型的,当往 Model 里 Set这个值的时候,如果 set 的这个属性是个对象,Spring 就会去找到对应的 editor 进行转换,然后再 SET 进去。 代码如下:
微风-- 轻许--
2019/07/02
6130
SpringMVC—json
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
Java架构师必看
2021/05/14
9400
SpringMVC—json
跟松哥学 SpringMVC(2/2)
SpringMVC 中对文件上传做了封装,我们可以更加方便的实现文件上传。从 Spring3.1 开始,对于文件上传,提供了两个处理器:
江南一点雨
2020/01/02
8630
日期格式化工具方法
  以上是基于jdk8语法实现,但格式化工具还是用的SimpleDateFormat,该类通过查看它的注解,可以知道它并不是线程安全的,但是每次单独实例化它也是比较耗费资源的。因此网上较流行的方式就是用ThreadLocal包裹,用空间换时间的方式,上述工具类为我自己的封装,如果有人看不下去的,有更好的替代方案或设计模式可以提出来哦
老梁
2019/09/10
9950
SpringMVC注解@initbinder解决类型转换问题
在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。 在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。 WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。 代码如下:
wuweixiang
2018/08/14
3530
SpringMVC自定义类型转换器(日期格式)模板
只需在要再要转换的类型上加上一个 @DateTimeFormat(pattern = “yyyy-MM-dd”) 如下:
用户9006224
2022/12/21
5930
java中各种时间格式的转化(包含java多数情况下时间的转换)
如果你想设置一个时间从一天的开始到一天的结束,那么你先要设置日期的格式为yyyy-MM-dd,然后在设置一个日期的格式为yyyy-MM-dd HH:mm:ss,然后在之前的日期格式上加上00:00:00-23:59:59转换成该日期格式,就可以设置区间为1天了。代码如下 如果时间为年月日,可以增加时分秒 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat
gfu
2019/08/28
2.2K0
Gson如何自定义Calendar序列化/反序列化
发现birthday最终实例化后,类型是 GregorianCalendar(即:抽象类Calendar的子类),然后把刚才的代码略改了下:
菩提树下的杨过
2022/04/27
8840
Gson如何自定义Calendar序列化/反序列化
Spring MVC入门与数据绑定
打开 Tomcat/conf/server.xml 添加 URIEncoding="UTF-8"
Breeze.
2022/10/31
4390
《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView、返回List、Map等等,这里就包含了传统的开发方式,和写接口的开发方式。
I Teach You 我教你
2019/05/25
9430
Android Study 之 彻底解决 Gson解析 异常 :JsonSyntaxException
开发过程中,App常用的接收参数的时候,几乎大部分都是以json格式为主,那么有关解析json的方式有很多,Android端相对来说使用Gson比较多,而在解析过程中,如果你遇到规范的后台,那你大可放心随便浪,But,如果遇到神后台,那么,呵呵了你就。真的想不到还会出现什么问题。。。
贺biubiu
2019/06/10
4.6K0
推荐阅读
相关推荐
SpringMVC数据类型转换器与国际化配置
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验