Я пытаюсь создать аннотированные классы JAXB для создания XML на основе Microsoft SharePoint Схема запроса. У меня есть класс 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 {
}
Однако использование абстрактного класса в SpWhereClause
не позволяет мне контролировать имя дочернего элемента. Этот:
@XmlElement
private AbstractSpComparison comparison;
Результаты в этом:
<Where>
<comparison>...</comparison>
</Where>
вместо этого:
<WHERE>
<Eq>...</Eq>
</WHERE>
Почему имя «Eq» из SpEqualsComparison
не используется для названия элемента сравнения? Как правильно поступить в такой ситуации?
Я рассматривал возможность использования всех возможных типов дочерних элементов в качестве свойства SpWhereClause
и устанавливал только тот, который мне нужен (где-то с некоторой логикой проверки), но это кажется излишне подробным.
Если это важно, я использую Пружина ОХМ Jaxb2Marshaller
.