Spring,Hibernate:尝试保存图像时,无效的UTF-8起始字节0x80错误

时间:2019-03-30 22:07:48

标签: 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字段)

因此,当“图像”中的“数据”字段为空时,这一切都起作用。否则,我在春季会遇到错误:

JsonMappingException: Invalid UTF-8 start byte 0x80

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

1 个答案:

答案 0 :(得分:1)

data:

实际上是一种URL格式(请参见IETF)。所以您真的仍然无法使用它。
即使你只有

/9j/4AAQSkZJRgABAQAA...

是经过编码的Base64 String,而不是字节数组。
您需要处理data字段,然后再次将String转换为byte[]

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