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

标签 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 变量。

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

我只想允许

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

但不是

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

@XmlElements 的 javadoc 声明它用于列表,这似乎是出现此行为的原因。

所以,我的问题是:

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

最佳答案

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

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

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

但是,由于 ABC 都继承自 BaseClass,您可能需要考虑使用@XmlElementRef对应于替换组的XML模式概念:

关于java - @XmlElement 能够在元素类型上拥有更多并且只有一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765862/

相关文章:

java - JAXB:缺少命名空间

java - 将以单词形式书写的数字转换为整数?

mysql - Live Server 响应 mysql 不支持 ExtractValue 函数

java - 如何调用同名不同返回值的不同类型对象的方法?

java - eclipse "Sorry- The application (Appname) has stopped unexpectedly. Please try again"

c# - 使用 C# 解析 XML 文件?

java - 通过 javax.xml 更改日期格式输出

java - 将 request.getParameterMap() 转换为 bean

java - DatabaseMetaData#g​​etFunctionColumns 的 functionColumnReturn 常量?

java - 浏览器无法在 gmail api 中打开