0

我有以下两个课程。JAXB 不将答案列表编组为 XML 有什么原因吗?我遗漏了其他正确编组的属性。是的,答案列表已填充,但未显示答案元素。

public class Question {

    private List<Answer> answers;

    public List<Answer> getAnswers() {
        return answers;
    }

    public void setAnswers(final List<Answer> answers) {
        this.answers = answers;
    }
}

和测验对象

@XmlRootElement
public class Quiz {

    private List<Question> questions;

    public Quiz() {
        questions = new ArrayList<Question>();
    }

    public List<Question> getQuestions() {
        return questions;
    }

    public void setQuestions(List<Question> questions) {
        this.questions = questions;
    }
}
4

1 回答 1

1

你的模特照原样为我工作。请参见下面的示例:

演示

package forum13350129;

import java.util.*;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Quiz.class);

        Question question1 = new Question();
        List<Answer> answers1 = new ArrayList();
        answers1.add(new Answer());
        answers1.add(new Answer());
        question1.setAnswers(answers1);

        Question question2 = new Question();
        List<Answer> answers2 = new ArrayList();
        answers2.add(new Answer());
        answers2.add(new Answer());
        question2.setAnswers(answers2);

        Quiz quiz = new Quiz();
        quiz.getQuestions().add(question1);
        quiz.getQuestions().add(question2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(quiz, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<quiz>
    <questions>
        <answers/>
        <answers/>
    </questions>
    <questions>
        <answers/>
        <answers/>
    </questions>
</quiz>

更新#1

如果您像我一样尝试将它作为 JSON 格式获取呢?

这取决于。JSON 绑定不是JAXB (JSR-222)规范的一部分。这意味着您的环境正在执行以下操作之一:

  1. 将 JAXB impl 与 Jettison 之类的库一起使用来生成 JSON(请参阅: http ://blog.bdoughan.com/2011/04/jaxb-and-json-via-jettison.html )
  2. 使用 JSON 绑定库(例如有一些 JAXB 注释支持的 Jackson)
  3. 使用提供 JSON 绑定的 JAXB impl,例如 EclipseLink MOXy(请参阅: http ://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html )。

使用EclipseLink JAXB (MOXy)如下:

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
    marshaller.marshal(quiz, System.out);

将产生以下 JSON:

{
   "quiz" : {
      "questions" : [ {
         "answers" : [ {
         }, {
         } ]
      }, {
         "answers" : [ {
         }, {
         } ]
      } ]
   }
}

更新#2

我已经解决了延迟加载关系的问题。我在存储库中使用 Hibernate.initialize。我正在尝试从我拥有的资源中返回这个测验对象。我正在使用 JAX-RS。

我看到人们在将 Hibernate 模型编组为 XML 时遇到问题。我相信这个问题是由于 Hibernate 使用的代理对象造成的。在下面的链接中,我建议使用 anXmlAdapter在代理对象和真实对象之间进行转换,这很有帮助。

于 2012-11-12T19:40:56.017 回答