java - Spring , hibernate : Invalid UTF-8 start byte 0x80 error when trying to save images

标签 java json spring hibernate spring-boot

我正在尝试发送包含图像数组的 json:

{
 Title: "Hello",
 images: [
   { 
     fileName: "hello",
     data: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA..."
   }
  ]
}

并在Spring+Hibernate中将其保存到该实体中:

@Entity
@Table(name = "flat")
public class Flat {

    private Title;

    @OneToMany(fetch = FetchType.LAZY,
        cascade = CascadeType.ALL,
        mappedBy = "flat")
    private List<File> images = new ArrayList<>(); //see the File entity below

...

这是文件实体:

@Entity
@Table(name = "file")
public class File {
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "flat_id")
    private Flat flat;

    @Lob
    private byte[] data;
...

(两个实体都有一个 id 字段)

因此,当“图像”中的“数据”字段为空时,一切都有效。否则,我在 spring 中会收到错误:

JsonMappingException: Invalid UTF-8 start byte 0x80

我在这里看到了一个类似的问题( Jackson JSON parser invalid utf-8 start byte ),答案是关于错误的编码,但我仍然不明白如何在我的情况下解决它。

最佳答案

data:

实际上是一种 URL 格式(参见 IETF )。所以你真的无论如何都不能使用它。
即使你只有

/9j/4AAQSkZJRgABAQAA...

这是一个编码的 Base64 String,而不是字节数组。
您需要处理data字段,并将String再次转换为byte[]

我建议您避免直接将请求/响应主体映射到 JPA 实体,而是创建一个 DTO 类,您将使用它来映射到实体(反之亦然),并应用所需的转换。

关于java - Spring , hibernate : Invalid UTF-8 start byte 0x80 error when trying to save images,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55436065/

相关文章:

Java对象列表按未排序的特定对象排序

javascript - 如何获取 JavaScript *代码文件*(输入中的字符串形式的代码)的 JSON(或等效)表示形式?

spring - HATEOAS微服务的跨服务链接

java - 使用 OOo 在 java 中将文档转换为 pdf

java - 如何在java中获取用户的操作系统区域设置

java - 我正在学习java中的异常处理(基本上是继承)

java - 如何将 Java 对象转换为 JSONObject?

java - 常见 spring NoRepositoryBean 基接口(interface)上的 PreAuthorize 问题

java - 对于模拟对象,Mockito 休息模板始终为空

java - JDBC 准备好的语句与 Hibernate session 事务只读操作