我遗漏了所有其他属性等。我在问题中列出的所有列表都没有序列化。我添加了答案列表的示例。 JSON响应很好,除了“答案”为空。为什么?当我将它打印到控制台时,测验对象完全初始化(是的,即使它是延迟加载,存储库层中的自定义代码也要处理)。我也用调试器来检查。
@XmlRootElement
public class Quiz {
private List<Question> questions;
public List<Question> getQuestions() {
return questions;
}
public void setQuestions(List<Question> questions) {
this.questions = questions;
}
}
public class Question {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "QuestionId", nullable = false)
@XmlElementWrapper(name = "answers")
public List<Answer> getAnswers() {
return answers;
}
public void setAnswers(final List<Answer> answers) {
this.answers = answers;
}
}
@Entity
@Table(name = "Answer")
public class Answer {
}
编辑:
似乎未注释的代码导致了问题。切换注释使代码工作。
public void setAnswers(final List<Answer> answers) {
//this.answers = answers;
this.answers.clear();
for (Answer answer : answers) {
addAnswer(answer);
}
}
public void addAnswer(final Answer answer) {
if (!(answers.contains(answer))) {
checkThatOnlyOneAnswerMayBeCorrect(answer);
answers.add(answer);
}
}
答案 0 :(得分:2)
关于JAXB (JSR-222)实现的一个重要注意事项是,如果您已预先初始化了List
值,那么将使用该值。例如,如果您的answers
字段初始化如下,则将使用ArrayList
的实例。
List<Answer> answers = new ArrayList<Answer>();
如果您按照以下方式初始化answers
字段,则会使用LinkedList
的实例。
List<Answer> answers = new LinkedList<Answer>();
这意味着问题在于以下代码。当您在clear
字段上执行answers
时,您也会清除传入的值,因为它们是同一个实例。
public void setAnswers(final List<Answer> answers) {
//this.answers = answers;
this.answers.clear();
for (Answer answer : answers) {
addAnswer(answer);
}
}
了解更多信息