Как обеспечить расширяемость схемы с помощью JAXB - PullRequest
2 голосов
/ 07 января 2009

Если я использую JAXB как часть Metro Web Services под Glassfish v2, как сказать JAXB добавить:

 <xsd:any/> and <xsd:anyAttribute/>

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

Документация JAXB кажется несколько недостающей.

Ответы [ 2 ]

1 голос
/ 09 января 2009

Хорошо, вот как я заставил это работать:

import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;


public class SchemaExtensible
{
    @XmlAnyElement(lax=true)
    private List<Element> otherElements;

    @XmlAnyAttribute
    private Map<QName,Object> otherAttributes;
}

Это не идеально, потому что теперь мне нужно расширять этот класс для каждого класса ответа, который я хочу расширить (и в некоторых случаях это мешает мне расширяться из класса запроса). Если бы эти 2 аннотации уровня метода и поля могли быть улучшены, чтобы позволить их добавлять на уровне класса, тогда они могли бы просто сказать «добавьте соответствующие теги в схему и просто отбросьте данные, если встретите», что было бы замечательно.

В любом случае фрагмент схемы выглядит так:

<xs:complexType name="SchemaExtensible">
  <xs:sequence>
    <xs:any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="skip"/>
 </xs:complexType>

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

1 голос
/ 08 января 2009

Просто используйте тип java.lang.Object. JAXB по умолчанию будет генерировать xsd: any. Я успешно возвратил экземпляр org.w3c.dom.Node из метода веб-службы с java.lang.Object в качестве возвращаемого типа. Я представляю, что будет что-то похожее для xsd: anyAttribute - возможно, с использованием возвращаемого типа объекта и аннотацией XmlAttribute JAXB?

Дополнение: Следующие аннотации выглядят так, как будто они достигают ваших целей. Оба являются частью спецификации JAXB 2.0.

@ XmlAnyAttribute @ XmlAnyElement

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