如何正确地在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,完美搞定~

原文地址:https://www.cnblogs.com/mightyvincent/p/8541517.html

时间: 2024-11-08 21:00:57

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

深入浅出学Spring Data JPA

第一章:Spring Data JPA入门   Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能 Hadoop - 基于 Spring 的 Hadoop 作业配置和一个 P

spring data jpa学习笔记一:helloworld

在学习 JPA Spring Data之前,我们有必要了解一下JPA和Spring Data. JPA JPA全称Java Persistence API.即java持久化规范.JPA通过注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. Spring Data Spring Data是Spring框架的一个子项目,就像Spring MVC是Spring的一部分一样.使得数据库访问变得方便和快捷.Spring Data 支持JPA. JPA Spring Data J

深入浅出学Spring Data JPA toPredicate Predicate[] p = new Predicate[list.size()]; query.where(cb.and

序言自工作以来,除了以前比较流量的hibernate,就是一直使用ORM 规范 JPA了.而这几天工作需要,研究了下JPA的标准查询,名为:JPA criteria查询.相比JPQL,其优势是类型安全,更加的面向对象.使用标准查询,开发人员可在编译的时候就检查查询的正确与否.而以前也只是在Hibernate中听说有过.具体不详,没用过.JPA元模型概念,及使用在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管实体定义的.这些实体可以是实体类,嵌入类或者映射的父类.提供受

Spring data jpa JavassistLazyInitializer 不仅是Json序列化问题.以及解决办法

最近偷点时间更新一下框架,使用SpringBoot2.0 整套一起更新一下,发现些小问题 Spring data jpa getOne 返回的是代理对象,延迟加载的,ResponseBody成Json的时候会有序列化问题,网上的都说加上这个就好了,这样是能返回. @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) 但是经过自定义的,但

Spring Data JPA、 MyBatis与Hibernate简单对比

整体参考: https://blog.csdn.net/xihuanyuye/article/details/81201441 详细参考: https://blog.csdn.net/qq897958555/article/details/53208002 1.Spring Data JPA与Hibernate Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现更简单和容易.Spring Data JP

Spring Data Jpa (四)注解式查询方法

详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQL查询有一个好处,就是启动的时候就知道语法正确与否. 声明一个注解在Repository的查询方法上. Like查询,注意firstname不会自动加上%关键字的 直接用原始SQL. nativeQuery不支持直接Sort的参数查询 错误方式: 正确方式: [email protected]排序

Spring Data JPA 和MyBatis比较

两种框架自己都用过一段时间,现在想总结一下各自适用的场景,部分比较取自群友分享 框架简介 Spring Data JPA是Spring Data的子模块.使用Spring Data,使得基于“repositories”概念的JPA实现更简单和容易.Spring Data JPA的目标是大大简化数据访问层代码的编码.作为使用者,我们只需要编写自己的repository接口,接口中包含一些个性化的查询方法,Spring Data JPA将自动实现查询方法.JPA默认使用hibernate作为ORM实

Spring Boot:整合Spring Data JPA

综合概述 JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范.其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据. 简而言之,JPA提供了使用面向对象的方式操作数据库的功能.JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用.伸缩性强等优点. Spring Data JPA是Spring基于Spring Data框架对于JPA

Spring data jpa @OneToMany 在一的一端进行查询()对集合属性设置条件查询)

业务场景: 一个商品对应多个仓存,需要查询商品在某个或某几个库存中存在时,查询出来. 实体类 ,商品Goods @Entity @Table(name = "es_goods") public class Goods { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "goods_id") private Integer id; private String name; //