我正在尝试创建带有JAXB注释的类,以基于Microsoft SharePoint Query架构生成XML 。我有一SpWhereClause
堂课:
@XmlType(name="Where")
@XmlAccessorType(XmlAccessType.FIELD)
public class SpWhereClause {
}
但是我不确定如何构造/注释其属性。一个<Where>
元素可以有许多不同类型的子元素(<Eq>
,<BeginsWith>
,<Contains>
等让我们忽略<And>
和<Or>
现在),但不超过一个。Eq
并且BeginsWith
分别是的单独有效子代Where
,但不能这样:
<Where>
<Eq>...</Eq>
<BeginsWith>...</BeginsWith>
</Where>
而不在元素中嵌套<Eq>
和。<BeginsWith>
<Or>
我的第一个想法是AbstractSpComparison
使用所有比较共用的<FieldRef>
和<Value>
元素创建一个类:
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class AbstractSpComparison {
@XmlElement
private SpFieldRef fieldRef;
@XmlElement
private SpValue value;
...
}
然后SpEqualsComparison
扩展它:
@XmlType(name="Eq")
public class SpEqualsComparison extends AbstractSpComparison {
}
但是,在中使用abstract类SpWhereClause
使我无法控制子元素的名称。这个:
@XmlElement
private AbstractSpComparison comparison;
结果:
<Where>
<comparison>...</comparison>
</Where>
代替这个:
<WHERE>
<Eq>...</Eq>
</WHERE>
为什么不使用“ Eq”名称SpEqualsComparison
来命名比较元素?处理这种情况的正确方法是什么?
我考虑过将所有可能的子元素类型都作为的属性SpWhereClause
,并且只设置我需要的子元素类型(在某处带有一些验证逻辑),但这似乎不必要地冗长。
如果有关系,我正在使用Spring OXM Jaxb2Marshaller
。
您可以执行几种不同的选择:
@XmlElementRef
如果所有内容都扩展了一个公共的超类(即AbstractSpComparison),则可以利用@XmlElementRef
注释。执行此操作时,子元素将与@XmlRootElement
所引用对象的类上的注释的值相对应。
@XmlElementRef
private AbstractSpComparison comparison;
想要查询更多的信息
我在博客上写了更多有关此方法的信息:
@XmlElements
如果一切都没有扩展一个公共的超类,那么您可以利用@XmlElements
注释,在其中显式注释哪些元素可能出现以及它们对应的类是什么:
@XmlElements({
@XmlElement(name="Eq", type=Eq.class),
@XmlElement(name="BeginsWith", type=BeginsWith.class)
})
private AbstractSpComparison comparison;
想要查询更多的信息
我在博客上写了更多有关此方法的信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句