2012-11-24 52 views
3

我已經省略了類中的所有其他屬性等。我在問題列表中沒有任何列表是序列化的。我已經添加了答案列表的一個例子。 JSON響應很好,只是「答案」爲空。爲什麼?當我將它打印到控制檯時,測驗對象完全處於初始狀態(是的,即使它是惰性加載,存儲庫層中的自定義代碼)。我也用調試器來檢查。JAXB不會序列化完整的對象圖

@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

爲什麼在二傳手的邏輯造成麻煩? – LuckyLuke

+0

'addAnswer'做什麼? –

+0

@BlaiseDoughan更新 – LuckyLuke

回答

2

需要注意JAXB (JSR-222)實現一個重要的事情是,如果你已經預先初始化List值值會被使用。例如,如果你的answers字段被初始化,那麼將使用ArrayList的實例。

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

如果你初始化answers場進行如下的的LinkedList實例將被使用。

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); 
    } 

} 

更多信息

+0

但是爲什麼它在控制檯上正確打印呢? – LuckyLuke

+0

我想到了!查看更新的問題。 – LuckyLuke

+0

@安迪 - 我已經更新了我的答案,我想我終於明白了。 –