@XmlElement,它可以在元素类型上只有一个实例

时间:2012-01-06 23:32:53

标签: java xml jaxb

我试图弄清楚如何注释一个类变量,使它最多只能有一个基本类型的元素 - 但具体类型可以是三个不同类中的一个。这是一个有希望解释我想要完成的事情的例子。

public class A extends Baseclass {}
public class B extends Baseclass {}
public class C extends Baseclass {}

public MyClass {

@XmlElements({
     @XmlElement(name="name1",type="A.class"),
     @XmlElement(name="name2",type="B.class"),
     @XmlElement(name="name3",type="C.class")
})
private Baseclass xyz;

...

}

此构造允许xml包含具有“name1”,“name2”或“name3”的多个元素。 JAXB显然只是解析了最后一个元素并将其用作“xyz”的值。

但是,我想要的是JAXB只允许A,B或C类型的一个元素分别带有“name1”,“name2”或“name3”。

xml看起来像:

<myElement>
    <name1></name1>
    <name1></name1>
    <name2></name2>
 </myElement>

在这种情况下,name2元素将被分配给xyz变量。

但我想要的是,如果使用上面的xml构造,JAXB会返回错误。

我想只允许

<myElement>
   <name1></name1>
</myElement>

但不是

<myElement>
   <name1></name1>
   <name1></name1>
   <name2></name2>
</myElement>

@XmlElements的javadoc声明它是用于列表的,这似乎就是这种行为发生的原因。

所以,我的问题是:

如何注释“xyz”以获得所需的行为? @XmlAdapter还是什么?

1 个答案:

答案 0 :(得分:0)

您需要使用架构验证来获取您正在寻找的行为。这是通过在Unmarshaller上设置XML模式来完成的,如果XML与XML模式不匹配则抛出错误:

如果您没有XML架构,可以使用JAXB从域模型生成一个:

@XmlElements对应于XML模式中的选择结构的概念,并且适用于您的用例。

但是,由于ABC都来自BaseClass,您可能需要考虑使用与@XmlElementRef对应的XML模式概念替代群: