JsonB, JPA, REST, CDI, Генерирование неполного JSON - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь получить объекты 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();
        }
    }

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 03 февраля 2020

Итак, я решил эту проблему, удалив методы в моих сущностях, которые начинаются с get .... и не возвращают переменную Class. Например, getLessonById () или что-то в этом роде. Я предполагаю, что JSON видит их как возвращающие переменные класса и хочет получить от них данные. Кроме того, двунаправленные отношения вызывают бесконечные циклы, поэтому либо вы используете указанные c аннотации, чтобы игнорировать их, либо просто избегаете их полностью.

...