JPA无法反序列化Java 8 LocalDateTime
我使用的是Spring Boot 1.5.1,当我的实体类中有LocalDateTime字段时,只要我点击API,就会出现异常 MySQL dt列是TIMESTAMP JPA是否无法本机反序列化LocalDateTime 执行GET请求时的控制台输出JPA无法反序列化Java 8 LocalDateTime,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我使用的是Spring Boot 1.5.1,当我的实体类中有LocalDateTime字段时,只要我点击API,就会出现异常 MySQL dt列是TIMESTAMP JPA是否无法本机反序列化LocalDateTime 执行GET请求时的控制台输出 2017-03-02 22:00:18.797 ERROR 13736 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for
2017-03-02 22:00:18.797 ERROR 13736 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize] with root cause
java.io.StreamCorruptedException: invalid stream header: 20323031
预订。课程
package com.example.springboot.reservation;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
// Model class
@Entity
@Table(name="reservation")
public class Reservation {
@Id
private Long id;
@Column
private LocalDateTime dt;
@Column(name="user_id")
private Long userId;
// Hibernate will convert camel case column names to snake case!!!
// Don't use camelcase columns in DB
@Column(name="party_size")
private int partySize;
public Reservation() {}
public Reservation(Long id, Long userId, int partySize) {
this.id = id;
this.userId = userId;
this.partySize = partySize;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public LocalDateTime getDt() {
return dt;
}
public void setDt(LocalDateTime dt) {
this.dt = dt;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public int getPartySize() {
return partySize;
}
public void setPartySize(int partySize) {
this.partySize = partySize;
}
}
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
org.springframework.boot
spring启动程序父级
1.5.1.1发布
org.springframework.boot
spring引导启动器数据jpa
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧靴开发工具
运行时
mysql
mysql连接器java
运行时
org.springframework.boot
弹簧起动试验
测试
1.8
您可以按如下所述编写转换器:
@Converter(autoApply = true)
public class MyLocalDateConverter implements AttributeConverter<java.time.LocalDate, java.sql.Date> {
@Override
public java.sql.Date convertToDatabaseColumn(java.time.LocalDate attribute) {
return attribute == null ? null : java.sql.Date.valueOf(attribute);
}
@Override
public java.time.LocalDate convertToEntityAttribute(java.sql.Date dbData) {
return dbData == null ? null : dbData.toLocalDate();
}
}
@转换器(autoApply=true)
公共类MyLocalDateConverter实现AttributeConverter{
@凌驾
public java.sql.Date convertToDatabaseColumn(java.time.LocalDate属性){
返回属性==null?null:java.sql.Date.valueOf(属性);
}
@凌驾
public java.time.LocalDate convertToEntityAttribute(java.sql.Date dbData){
返回dbData==null?null:dbData.toLocalDate();
}
}
如果您没有使用JPA 2.0,这将有助于您使用LocalDateTime的
@Temporal
注释。您可以在spring软件包中找到一些已烘焙的转换器:
org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters
JDocs:
JPA2.1转换器将JSR-310类型转换为遗留日期。要激活这些转换器,请确保持久性提供程序通过将此类包含在映射类列表中来检测它们。在Spring环境中,您只需将此类的包(即org.springframework.data.jpa.convert.threeten)注册为要在LocalContainerEntityManagerFactoryBean上扫描的包
如果使用具有LocalDateTime支持的较新的hibernate-java8,则不需要转换器
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
org.hibernate
hibernate-java8
${hibernate.version}
使用jpa转换器完成此任务。您能尝试在私有LocalDateTime dt上使用@Temporal(TemporalType.TIMESTAMP)吗;使用@Column>>注意,您需要这些导入1-导入javax.persistence.Temporal;2-导入javax.persistence.TemporalType;你不需要转换器。仅添加hibernate-java8
依赖项。该示例显示了具有策展依赖项的POM。所以这不是一个正确的方法。它支持“SpringDataJPA1.8”。
org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-java8</artifactId>
<version>${hibernate.version}</version>
</dependency>