Я пытаюсь получить объекты Jsonb из моей БД. Когда я пытаюсь получить все уроки из БД, я получаю сообщение об ошибке
Schwerwiegend: Generating incomplete JSON
Warnung: StandardWrapperValve[rest.ApplicationConfig]: Servlet.service() for servlet rest.ApplicationConfig threw exception
java.lang.StackOverflowError
. Я понял, что это из-за способа построения моего класса. В моем классе уроков есть список вопросов, показанный ниже
@Entity
public class Lesson extends EntityWithIntId {
private String lessonName;
@OneToMany(mappedBy="lessonID",cascade = CascadeType.ALL)
private List<Question> questions = new ArrayList<>();
public Lesson() {
}
public Lesson(String lessonName) {
this.lessonName = lessonName;
}
public void addQuestion(Question question) {
this.questions.add(question);
}
// getter setter
}
Класс вопросов:
@Entity
public class Question extends EntityWithIntId {
@ManyToOne
@JoinColumn(name = "lessonID")
private Lesson lessonID;
private String question;
@ElementCollection
@MapKeyColumn(name = "answer")
@Column(name = "solution")
@CollectionTable(name = "answers", joinColumns = @JoinColumn(name = "questionID"))
Map<String, Integer> answers = new LinkedHashMap<>();
public Question() {
}
public Question(Lesson lessonID) {
this.lessonID = lessonID;
}
public Question(String question) {
this.question = question;
}
public Question(Lesson lessonID, String question) {
this.lessonID = lessonID;
this.question = question;
}
public void addAnswer(String answer) {
this.answers.put(answer, 0);
}
// getter setter
}
Итак, я немного протестировал и заметил, что если я создаю соединение между уроком и вопросом, подобным этому :
@Entity
public class Lesson extends EntityWithIntId {
private String lessonName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "lessonID")
private List<Question> questions = new ArrayList<>();
}
@Entity
public class Question extends EntityWithIntId {
private int lessonID;
private String question;
@ElementCollection
@MapKeyColumn(name = "answer")
@Column(name = "solution")
@CollectionTable(name = "answers", joinColumns = @JoinColumn(name = "questionID"))
Map<String, Integer> answers = new LinkedHashMap<>();
}
Все работает как положено, и я получаю свой Json объект. Проблема в том, что я не могу изменить всю структуру БД и мою программу только для этого. Я также должен использовать JsonB, так что другого выбора нет. Должен быть способ получить правильный объект Json из моей текущей БД.
Вот метод @Get:
@GET
@Produces({MediaType.APPLICATION_JSON})
public Response getAllLesssons() {
if (super.findAll() != null) {
return Response.ok(super.findAll()).build();
} else {
String message = "Lessons not found!";
return Response.ok().type(MediaType.TEXT_PLAIN).entity(message).build();
}
}
Кто-нибудь знает, как решить эту проблему?