Java JAXB不会序列化完整的对象图
我在课堂上遗漏了所有其他属性等。我所讨论的列表中没有一个是序列化的。我添加了一个答案列表的示例。JSON响应很好,只是“answers”为null。为什么?当我将测验对象打印到控制台时,它是完全初始化的(是的,即使它是延迟加载的,在存储库层中的自定义代码也会得到处理)。我还使用调试器进行检查Java JAXB不会序列化完整的对象图,java,jakarta-ee,jaxb,marshalling,Java,Jakarta Ee,Jaxb,Marshalling,我在课堂上遗漏了所有其他属性等。我所讨论的列表中没有一个是序列化的。我添加了一个答案列表的示例。JSON响应很好,只是“answers”为null。为什么?当我将测验对象打印到控制台时,它是完全初始化的(是的,即使它是延迟加载的,在存储库层中的自定义代码也会得到处理)。我还使用调试器进行检查 @XmlRootElement public class Quiz { private List<Question> questions; public List<Qu
@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 {
}
@XmlRootElement
公开课测验{
私人名单问题;
公共列表问题(){
回答问题;
}
公共问题(列出问题){
这个。问题=问题;
}
}
公开课问题{
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“QuestionId”,null=false)
@xmlementwrapper(name=“answers”)
公共列表getAnswers(){
返回答案;
}
公开答案(最终答案列表){
这个。答案=答案;
}
}
@实体
@表(name=“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);
}
}
public void setAnswers(最终列表答案){
//这个。答案=答案;
这个.answers.clear();
for(答案:答案){
addAnswer(答案);
}
}
公共无效添加答案(最终答案){
如果(!(answers.contains(answer))){
检查是否只有一个人是正确的(回答);
答案。添加(答案);
}
}
关于实现,需要注意的一点是,如果您预先初始化了列表
值,则将使用该值。例如,如果您的answers
字段初始化为follow,则将使用ArrayList
的实例
List<Answer> answers = new ArrayList<Answer>();
List<Answer> answers = new LinkedList<Answer>();
这意味着以下代码存在问题。当您在answers
字段上执行clear
时,您也在清除传入的值,因为它们是相同的实例
public void setAnswers(final List<Answer> answers) {
//this.answers = answers;
this.answers.clear();
for (Answer answer : answers) {
addAnswer(answer);
}
}
public void setAnswers(最终列表
为什么setter中的逻辑会导致问题?你确定最终填充了answers
字段吗?是的。当我只使用这个字段时,它就工作了。answers=answers;我怀疑你的设置逻辑中有错误。如果你发布足够的代码来重现问题,我可以查看它。奇怪的是,它在注释我的内容b“私奔让一切都不同了。其他名单也一样。@Andy-我更新了我的答案,我想我终于找到了答案。”。