java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 JpaSystemException 的 jsonb 类型数据

Posted

技术标签:

【中文标题】java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 JpaSystemException 的 jsonb 类型数据【英文标题】:jsonb type data saving with postgres db and spring boot getting JpaSystemException after java 8 to java 11 migration 【发布时间】:2021-08-28 23:31:46 【问题描述】:

我正在尝试使用以下库将 jsonb 类型的数据保存到 Postgres db 表中

   <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.11.1</version>
   </dependency>
   <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.14</version>
   </dependency>

在 java 8 中它没有任何问题,但是由于要求我不得不将服务迁移到 java 11,但是在迁移之后,当我尝试将 jsonb 保存到表中时,我得到了以下错误。

org.springframework.orm.jpa.JpaSystemException: java.lang.IllegalArgumentException: 给定的字节数组不能转换为Json对象;嵌套异常是 org.hibernate.HibernateException: java.lang.IllegalArgumentException: 给定的字节数组无法转换为 Json 对象。

注意 - java 8 和 java 11 中的 Hibernate 版本相同 版本:5.4.20.Final 都在

以下是试图保存的实体

@Builder(toBuilder = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "test")
@TypeDefs(
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),
)
public class Test extends Auditable 

    @Id
    @Column(name = "id", updatable = false, nullable = false, unique = true)
    private UUID id;

    @Type(type = "jsonb")
    @Column(name = "data", columnDefinition = "jsonb")
    private RequestEventDto data;


下面是RequestEventDto

import lombok.Builder;
import lombok.Data;

import java.util.List;
import java.util.Map;

@Data
@Builder
public class RequestEventDto 
    private String requestId;

    @Builder.Default
    private String applicationId = "program1";

    private String entityType;
    private List<Map<String, Object>> listEntities;

你能帮忙解决这个问题吗?

【问题讨论】:

能否请您也显示RequestEventDto 嗨,@SternK 我在问题中更新了它。谢谢 一定有另一个异常原因可以告诉您更多关于实际问题的信息。附加完整的堆栈跟踪。 【参考方案1】:

通过将以下注释添加到 RequestEventDto 解决的问题

@NoArgsConstructor
@AllArgsConstructor
public class RequestEventDto 

似乎是由于序列化发生时构造函数不存在。

【讨论】:

以上是关于java 8 到 java 11 迁移后使用 postgres db 和 spring boot 保存 JpaSystemException 的 jsonb 类型数据的主要内容,如果未能解决你的问题,请参考以下文章

将Applet应用程序迁移到Java 11

OSGI - Java 8 -> 9 迁移(需求能力问题)

Java 8 失宠!开发人员向 Java 11 转移...

Java 8 失宠!开发人员向 Java 11 转移...

Java 8失宠!开发人员向 Java 11转移...

使用 Java 11 运行 Sonar Scanner 时主版本号错误