我试图弄清楚如何注释一个类变量,使它最多只能有一个基本类型的元素 - 但具体类型可以是三个不同类中的一个。这是一个有希望解释我想要完成的事情的例子。
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还是什么?
答案 0 :(得分:0)
您需要使用架构验证来获取您正在寻找的行为。这是通过在Unmarshaller
上设置XML模式来完成的,如果XML与XML模式不匹配则抛出错误:
如果您没有XML架构,可以使用JAXB从域模型生成一个:
@XmlElements
对应于XML模式中的选择结构的概念,并且适用于您的用例。
但是,由于A
,B
和C
都来自BaseClass
,您可能需要考虑使用与@XmlElementRef
对应的XML模式概念替代群: