gpt4 book ai didi

java - JsonB、JPA、REST、CDI、生成不完整的 JSON

转载 作者:行者123 更新时间:2023-12-01 18:36:48 24 4
gpt4 key购买 nike

我正在尝试从我的数据库获取 Jsonb 对象。当尝试从数据库获取所有类(class)时,我收到错误

Schwerwiegend:   Generating incomplete JSON
Warnung: StandardWrapperValve[rest.ApplicationConfig]: Servlet.service() for servlet rest.ApplicationConfig threw exception
java.lang.StackOverflowError

我发现这是因为我的类(class)的构建方式。我的类(class)有如下所示的问题列表

@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
}

所以我进行了一些测试,发现如果我在类(class)和问题之间建立这样的连接:

@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();
}
}

有人知道如何解决这个问题吗?

最佳答案

因此,我通过删除实体中以 get... 开头且不返回类变量的方法解决了这个问题。例如 getLessonById() 或类似的东西。我猜 JSON 将它们视为类变量返回者并希望从中获取数据。此外,双向关系会导致无限循环,因此您要么使用特定的注释来忽略它们,要么完全避免它们。

关于java - JsonB、JPA、REST、CDI、生成不完整的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60020835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com