gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:17:10 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com