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

发布于 2024-12-25 15:23:05 字数 1236 浏览 3 评论 0 原文

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

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

I am trying to figure out how to annotate a class variable so that it can have at most one element of a base type - but the concrete type can be one of three different classes. Here is an example that hopefully should explain what I am trying to accomplish.

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;

...

}

This construct allows the xml to contain multiple elements with "name1", "name2", or "name3". JAXB evidently just takes the last element parsed and uses that one as the value for "xyz".

However, what I want is for JAXB to allow only one element of of type A, B, or C with "name1", "name2" or "name3" respectively.

The xml looks like:

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

In this case, the name2 element wil be assigned to the xyz variable.

But what I want is for JAXB to return an error if the above xml construct is used.

I want to allow only

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

but not

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

The javadoc for @XmlElements states that it is for lists, which seems to be why this behavior is occurring.

So, my question is:

How do I annotate "xyz" to obtain the desired behavior? @XmlAdapter or something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瀟灑尐姊 2025-01-01 15:23:05

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

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

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

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

You will need to use schema validation to get the behaviour you are looking for. This is done by setting an XML schema on the Unmarshaller to have an error thrown if the XML does not match the XML schema:

If you do not have an XML schema you can use JAXB to generate one from your domain model:

@XmlElements corresponds to the concept of a choice structure in XML schema and will work for your use case.

However, since A, B, and C all extend from BaseClass you may want to consider using @XmlElementRef which corresponds to the XML schema concept of substituion groups:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文