Java @XmlElement,它能够在元素类型上拥有更多元素,并且只有一个实例

Java @XmlElement,它能够在元素类型上拥有更多元素,并且只有一个实例,java,xml,jaxb,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

我试图弄清楚如何注释一个类变量,这样它最多只能有一个基类型的元素——但具体类型可以是三个不同类中的一个。这里有一个例子,希望能解释我试图实现的目标

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变量

但我希望JAXB在使用上述xml构造时返回一个错误

我只想允许

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

但不是

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

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

所以,我的问题是:


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

您需要使用模式验证来获得所需的行为。这是通过在
解组器
上设置XML架构来完成的,如果XML与XML架构不匹配,则会引发错误:

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

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

<>但是,由于<代码> < <代码> >代码> b>代码>和<代码> c>代码>都从<代码> BaseClass < /代码>扩展,您可能需要考虑使用<代码> > XMLLealEngfF,这对应于替换组的XML模式概念:


您将需要使用模式验证来获得所需的行为。这是通过在
解组器
上设置XML架构来完成的,如果XML与XML架构不匹配,则会引发错误:

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

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

<>但是,由于<代码> < <代码> >代码> b>代码>和<代码> c>代码>都从<代码> BaseClass < /代码>扩展,您可能需要考虑使用<代码> > XMLLealEngfF,这对应于替换组的XML模式概念: