3

クラスから他のすべてのプロパティなどを除外しました。質問にあるリストはどれもシリアル化されていません。回答リストの例を追加しました。JSON 応答は、"answers" が null であることを除いて問題ありません。なんで?コンソールに出力すると、quiz オブジェクトは完全に初期化されます (はい、レイジー ロードされ、リポジトリ レイヤーのカスタム コードであっても処理されます)。また、デバッガーを使用して確認しました。

@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 に答える