Spring, Hibernate: Недопустимая ошибка начала байта UTF-8 0x80 при попытке сохранить изображения - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь отправить 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;
...

(оба объекта имеют поле идентификатора)

Итак, все работает, когда поле «data» в «images» пусто. В противном случае я получаю сообщение об ошибке весной:

JsonMappingException: Invalid UTF-8 start byte 0x80

Я видел похожий вопрос здесь ( JSON-синтаксический анализатор JSON недопустимый начальный байт utf-8 ), и там был ответ о неправильных кодировках, но я все еще не могу понять, как я могу решить его в моем случае .

1 Ответ

1 голос
/ 31 марта 2019
data:

на самом деле является форматом URL (см. IETF ).Таким образом, вы действительно не могли бы использовать это в любом случае.
Даже если у вас было только

/9j/4AAQSkZJRgABAQAA...

, которое является закодированным Base64 String, а не массивом байтов.
Вам нужно обработать поле data и снова преобразовать String в byte[].

Я бы посоветовал вам избегать прямого сопоставления тела запроса / ответа с сущностью JPA, вместо этого создайтекласс DTO, который вы будете использовать для сопоставления с сущностью (и наоборот), применяя необходимые преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...