Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB不会序列化完整的对象图_Java_Jakarta Ee_Jaxb_Marshalling - Fatal编程技术网

Java JAXB不会序列化完整的对象图

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

我在课堂上遗漏了所有其他属性等。我所讨论的列表中没有一个是序列化的。我添加了一个答案列表的示例。JSON响应很好,只是“answers”为null。为什么?当我将测验对象打印到控制台时,它是完全初始化的(是的,即使它是延迟加载的,在存储库层中的自定义代码也会得到处理)。我还使用调试器进行检查

@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-我更新了我的答案,我想我终于找到了答案。”。