如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)

Posted mightyvincent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)相关的知识,希望对你有一定的参考价值。

用过的肯定知道,JSR310的时间API真的是神器,极大的方便了在Java中对时间操作的过程。

JSR 310规范领导者Stephen Colebourne就是joda-time作者,其主要思想也是借鉴了joda-time,而不是直接把joda-time移植到Java平台中,API是类似的,但做了改进,具体的改进请参考其2009年的一篇文章和InfoQ对他的采访:

http://blog.joda.org/2009/11/why-jsr-310-isn-joda-time_4941.html

http://www.infoq.com/cn/news/2010/05/jsr-310

http://blog.joda.org/2010/12/what-about-jsr-310_153.html

规范下载地址:https://jcp.org/en/jsr/detail?id=310

东西是挺好,平常时候直接用就行了,毕竟这个也能自由的跟旧的Date等API转换,虽然写起来会略啰嗦,如:

LocalDateTime nowLocalDateTime = LocalDateTime.now();
Date nowDate = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());

不过为了更方便的操作时间也能忍了。

可毕竟是新东西,在之前做项目的时候就遇到了这么两个问题。

Spring Data JPA结合

我想在Spring Data JPA(以下简称JPA,但注意JPA其实是一种规范)中的@Entity实体类中将LocalDateTime作为属性的类型来使用,如:

@Entity
public class Product {
    ...
    @Column
    private LocalDateTime gmtCreate;
    ...
}

结果问题来了,当时具体抛什么异常忘记了,大概是什么无法反序列化之类的,总之就是没法用。

其实很简单,熟悉JPA的应该已经想到了,要用上javax.persistence.AttributeConverter了,网上也有不少自己实现这个转化器的文章,而Spring Data JPA后续也已经有了针对JSR310的实现也即org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters

而如果你是Spring Boot项目的话,用起来就超级简单了,只需要在启动类上增加一个注解,将Jsr310JpaConverters注册为Bean就可以实现用LocalDateTime作为实体类的属性类型了。注解如下:

@EntityScan(basePackageClasses = {Jsr310JpaConverters.class})

Jackson结合

后端的问题解决了,可当前端用到的时候,却又出现了问题,具体抛出什么异常我也给忘了([捂脸]),大概还是不能反序列化之类的吧。

求助搜索引擎后了解到,原来Jackson默认也是没有兼容JSR310的时间API的,所以这时候需要引入对应的Jackson的相关模组(那个关键类就叫com.fasterxml.jackson.datatype.jsr310.JavaTimeModule),如果是使用Gradle的话也就是引入如下依赖:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")

OK,完美搞定~

以上是关于如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-data-jpa 获取这些数据如何更正确?

如何在 Spring data jpa 中正确使用 findBySomeOtherId 而不是 findById?

Spring-data-jpa 投影生成查询不正确

如何在 Spring Data 中漂亮地更新 JPA 实体?

spring-data-jpa 如何使用多个数据源? [复制]

spring-data-jpa软删除方案