@XmlElement, который может иметь больше, чем для типа элемента и только один экземпляр - PullRequest
2 голосов
/ 07 января 2012

Я пытаюсь выяснить, как аннотировать переменную класса, чтобы она могла содержать не более одного элемента базового типа, но конкретный тип может быть одним из трех разных классов. Вот пример, который, я надеюсь, должен объяснить, чего я пытаюсь достичь.

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>

Javadoc для @XmlElements утверждает, что он предназначен для списков, что, по-видимому, является причиной такого поведения.

Итак, мой вопрос:

Как мне аннотировать "xyz", чтобы получить желаемое поведение? @XmlAdapter или что-то?

1 Ответ

0 голосов
/ 07 января 2012

Вам нужно будет использовать проверку схемы, чтобы получить поведение, которое вы ищете. Это делается путем установки схемы XML на Unmarshaller для выдачи ошибки, если XML не соответствует схеме XML:

Если у вас нет схемы XML, вы можете использовать JAXB для ее создания из модели вашего домена:

@XmlElements соответствует концепции структуры выбора в XML-схеме и будет работать для вашего варианта использования.

Однако, поскольку A, B и C все простираются от BaseClass, вы можете рассмотреть возможность использования @XmlElementRef, что соответствует концепции схемы XML групп замещения:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...