2

我有一个QuestionsData类有一个列表QuestionData。是QuestionData一个抽象类,有两个实现:TextQuestionDataSelectionQuestionData.

问题是,在做之后clientResponse.getEntity,我得到的对象只有一个列表SelectionQuestionData,而我知道有些问题是类型的TextQuestionData

我尝试添加@XmlSeeAlso,但没有帮助。我还尝试更改元素的顺序,@XmlElementRefs但这导致所有问题都是 type TextQuestionData

我不知道这是否相关,但我在球衣中使用的对象是另一个QuestionsData作为成员的Jaxb 对象

这是代码:

@XmlRootElement(name = "questions")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({SelectionQuestionData.class, TextQuestionData.class })
public class QuestionsData {

    @XmlElementRefs({@XmlElementRef(type = TextQuestionData.class), @XmlElementRef(type = SelectionQuestionData.class)})
    private List<QuestionData> questions;

    private QuestionsData() {}

    public QuestionsData(List<QuestionData> questions) {
        this.questions = questions;
    }
}


@XmlRootElement(name = "question")
@XmlAccessorType(XmlAccessType.FIELD)
public class TextQuestionData extends QuestionData {

    @XmlElement
    private String someString;

    public TextQuestionData() {}
}


@XmlRootElement(name = "question")
@XmlAccessorType(XmlAccessType.FIELD)
public class SelectionQuestionData extends QuestionData {

    @XmlElements({@XmlElement(name = "option")})
    private List<String> options;

    public  SelectionQuestionData() {}
}
4

1 回答 1

1

在此用例中,元素名称用于确定@XmlRootElement在解组期间应实例化哪个子类(映射为 )。由于您将两个子类都映射到questionJAXB (JSR-222) 实现,因此无法确定要解组的正确子类。您需要将它们映射到不同的根元素。

文本问题数据

@XmlRootElement(name = "textQuestion")
@XmlAccessorType(XmlAccessType.FIELD)
public class TextQuestionData extends QuestionData {

    @XmlElement
    private String someString;

    public TextQuestionData() {}
}

选择问题数据

@XmlRootElement(name = "selectionQuestion")
@XmlAccessorType(XmlAccessType.FIELD)
public class SelectionQuestionData extends QuestionData {

    @XmlElements({@XmlElement(name = "option")})
    private List<String> options;

    public  SelectionQuestionData() {}
}

了解更多信息

于 2012-10-22T17:56:19.133 回答