【问题标题】:@XmlElement that is able to have more that on element type and only one instance@XmlElement 能够拥有更多元素类型并且只有一个实例
【发布时间】:2012-01-06 23:32:52
【问题描述】:

我试图弄清楚如何注释一个类变量,以便它最多可以有一个基本类型的元素 - 但具体类型可以是三个不同的类之一。这是一个示例,希望可以解释我要完成的工作。

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 还是什么?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

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

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

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

    但是,由于 ABC 都是从 BaseClass 扩展而来,您可能需要考虑使用对应于替换组的 XML 架构概念的 @XmlElementRef

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2020-04-20
      相关资源
      最近更新 更多