Ленивая инициализация Quarkus - PullRequest
2 голосов
/ 18 июня 2020

Я получаю следующую ошибку всякий раз, когда пытаюсь вернуть все записи с помощью метода rest.

Ошибка:

Обработка ошибок внутреннего сервера e6059ae8-5970-4ac2-a1fa-7325768944bb- 1, org.jboss.resteasy.spi.UnhandledException: javax.ws.rs.ProcessingException: RESTEASY008205: JSON Ошибка сериализации привязки javax. json .bind.JsonbException: Невозможно сериализовать свойство 'task' из model.Board

org.hibernate.LazyInitializationException: невозможно выполнить запрошенную ленивую инициализацию [model.Board.task] - сеанс отсутствует, а настройки запрещают загрузку вне сеанса

первая модель

@Entity
public class Task{

    @Id
    @Column(name = "TaskID")
    public Long taskId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "BoardID")
    public Board board;

    @Column(name = "Title")
    public String title;

    @Column(name = "Description", length = 1000)
    public String description;
}

вторая модель

@Entity
public class Board{

    @Id
    @Column(name = "BoardID")
    public Long boardId;

    @OneToMany(mappedBy = "board")
    public List<Task> task = new ArrayList<>();;

    @Column(name = "Title")
    public String title;

    @Column(name = "Position")
    @NotNull
    public int position;
}

репозиторий:

@ApplicationScoped
@Transactional
public class BoardRepository implements PanacheRepository<Board> {
}

пример метода REST

@Transactional
@ApplicationScoped
public class ExampleResource {

    @Inject
    BoardRepository boardRepository;

    @Inject
    TaskRepository taskRepository;

    @GET
    @Transactional
    public List<Board> getAll() {
        return boardRepository.listAll();
    }
}

1 Ответ

4 голосов
/ 19 июня 2020

Проблема в том, что во время сериализации JSON он пытается сериализовать список task, который имеет обратную ссылку на Board, и что-то в этом графике может не инициализироваться. Кроме того, сериализация может привести к циклу, который нельзя смоделировать непосредственно в JSON, поэтому вам нужно как-то решить эту проблему.

  • Используйте @JsonIgnore, чтобы исключить поле из JSON сериализации
  • Используйте DTO, предпочтительно с Blaze-Persistence Entity-Views для лучшей производительности, который имеет интеграцию Quarkus , которая моделирует только подмножество состояния, которое вы действительно хочу выставить
...