我试图弄清楚如何注释一个类变量,以便它最多可以有一个基本类型的元素 - 但具体类型可以是三个不同类之一。这是一个示例,希望能够解释我想要实现的目标。
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?
发布评论
评论(1)
您将需要使用模式验证来获取您正在寻找的行为。这是通过在
Unmarshaller
上设置 XML 架构来完成的,如果 XML 与 XML 架构不匹配,则抛出错误:如果您没有 XML 模式,您可以使用 JAXB 从您的 XML 模式生成一个域模型:
@XmlElements
对应于 XML 模式中选择结构的概念,将适用于您的用例。但是,由于
A
、B
和C
全部从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
, andC
all extend fromBaseClass
you may want to consider using@XmlElementRef
which corresponds to the XML schema concept of substituion groups: