网站首页 > java教程 正文
优质文章,及时送达
学习目标
快速学会通过注解 @JsonComponent自定义日期格式化的序列化器。
快速查阅
专题阅读:《SpringBoot 布道系列》:https://www.jianshu.com/p/964370d9374e
源码下载:SpringBoot Date Format Anno:https://github.com/yizhiwazi/springboot-socks
使用教程
根据官方文档 Custom JSON Serializers and Deserializers ,想要接管Jackson的JSON的序列化和反序列化,只需通过注解
@JsonComponent
来声明其静态内部类即可。
首先根据项目要求提供自定义的日期序列化器和反序列化器,其中包括:
DateJsonSerializerextendsJsonSerializer<Date>
表示将Date格式化为日期字符串。DateJsonDeserializerextendsJsonDeserializer<Date>
表示将日期字符串解析为Date日期。
/**
* 全局日期格式化
*/
@JsonComponent
publicclassDateFormatConfig{
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 日期格式化
*/
public static class DateJsonSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(dateFormat.format(date));
}
}
/**
* 解析日期字符串
*/
public static class DateJsonDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
try {
return dateFormat.parse(jsonParser.getText);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
}
然后提供相应的测试信息,这里以查询用户为例:
/**
* 查询用户信息
*/
@RestController
public class UserController {
@GetMapping("/")
public User get {
return new User("1", "socks", "123456", new Date, "GMT");
}
}
/**
* 用户信息
*/
public class User {
private String userId;
private String username;
private String password;
private Date createTime;
private String timezone;
public User(String userId, String username, String password, Date createTime, String timezone) {
this.userId = userId;
this.username = username;
this.password = password;
this.createTime = createTime;
this.timezone = timezone;
}
//省略getters&setters
}
大功告成,接下来启动应用并访问 http://127.0.0.1:8080 ,可以拿到正确结果:
{
"userId": "1",
"username": "socks",
"password": "123456",
"createTime": "2018-12-26 01:03:25"
}
除了日期格式化解析之外,我们还可以在 DateFormatConfig
注入业务变量,例如根据当前登录人的所属时区(虽然SimpleDateFormat
默认读取了当地时区,但在实际的国际化系统中,用户的所属时区是指其在系统录入的所属时区,而不是指当地时区。例如Tony这个用户账号挂在GMT+0时区,但此时他出差在香港使用,系统仍需要按照GMT+0时区来显示时间),为了解决这个问题,此时我们可以在DateFormatConfig
注入当前登录人然后改变日期工具类的TimeZone
来动态修改时区。
根据当前登录人动态展示时区:
/**
* 全局日期格式化
*/
@JsonComponent
publicclassDateFormatConfig{
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") {
@Override
public Date parse(String source) throws ParseException {
try {
if (StringUtils.isEmpty(source)) {
return ;
}
return super.parse(source);
} catch (Exception e) {
return new StdDateFormat.parse(source);
}
}
};
private static UserController userController;//这里是指获取当前登录人的工具类
@Autowired
publicvoidsetUserController(UserController userController) {
DateFormatConfig.userController = userController;
}
/**
* 日期格式化
*/
public static class DateJsonSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//获取当前登录人的所属时区
dateFormat.setTimeZone(TimeZone.getTimeZone(userController.get.getTimezone));
//格式化日期
jsonGenerator.writeString(dateFormat.format(date));
}
}
/**
* 解析日期字符串
*/
public static class DateJsonDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
try {
//获取当前登录人的所属时区
dateFormat.setTimeZone(TimeZone.getTimeZone(userController.get.getTimezone));
//解析日期
return dateFormat.parse(jsonParser.getText);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
}
修改完后重新启动应用并访问 http://127.0.0.1:8080 ,可以拿到正确结果:
{
"userId": "1",
"username": "socks",
"password": "123456",
"createTime": "2018-12-25 17:35:50 +0000",
"timezone": "GMT"
}
公众号 Java后端 发布的关于 Spring Boot 相关的文章,我整理成了 PDF ,关注公众号 Java后端 ,回复 666 下载。
小结
1、使用注解 @JsonComponent
可以快速自定义日期格式化的序列化器,免除传统通过模块注册的烦恼。
2、使用注解 @JsonComponent
实现与当地无关的动态时区的精髓就在于将获取当前等人的方法写在解析日期和格式化日期的代码里。
3、使用注解 @JsonComponent
是直接处理String和Date的相互转换的,所以要注意空串问题。例如dateFormat.parse要预防空串。
作者:yizhiwazi
链接:https://www.jianshu.com/p/f4654d251104
-END-
如果看到这里,说明你喜欢这篇文章,请 。同时 标星(置顶)本公众号可以第一时间接受到博文推送。
最近整理一份面试资料《Java技术栈学习手册》,覆盖了Java技术、面试题精选、Spring全家桶、Nginx、SSM、微服务、数据库、数据结构、架构等等。
- 上一篇: java时间格式化(java时间格式化到毫秒)
- 下一篇: java之数据格式化(java格式化数字)
猜你喜欢
- 2024-10-24 没想到YYYY的格式化日期也有坑(yyyy时间格式)
- 2024-10-24 线程不安全的 SimpleDateFormat(线程不安全的原因)
- 2024-10-24 java DateFormat(javadateformat用法)
- 2024-10-24 FastJson时间格式化问题-踩坑集锦
- 2024-10-24 标签—时间格式化(添加时间标签)
- 2024-10-24 Java中常用类—格式化类 #java基础
- 2024-10-24 Go语言进阶之路(九):时间处理和格式化输出
- 2024-10-24 日期格式化跨年bug,是否与你不期而遇?
- 2024-10-24 JDK1.7和JDK1.8中日期时间使用和处理的不同「Java工程师必读」
- 2024-10-24 深度思考:JDK8中日期类型该如何使用?
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)