3

我已经从课程中遗漏了所有其他属性等。我在 Question 中的所有列表都没有序列化。我添加了答案列表的示例。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);
    }
}
4

1 回答 1

2

关于JAXB (JSR-222)实现需要注意的重要一点是,如果您已经预初始化了一个List值,则将使用该值。例如,如果您的answers字段按如下方式初始化,ArrayList则将使用该实例。

List<Answer> answers = new ArrayList<Answer>();

如果您answers按如下方式初始化您的字段,LinkedList则将使用该实例。

List<Answer> answers = new LinkedList<Answer>();

这意味着问题出在以下代码上。当您clearanswers字段上执行时,您也会清除传入的值,因为它们是相同的实例。

public void setAnswers(final List<Answer> answers) {

    //this.answers = answers;

    this.answers.clear();

    for (Answer answer : answers) {
        addAnswer(answer);
    }

}

了解更多信息

于 2012-11-24T22:57:07.740 回答