Хорошо, вот как я заставил это работать:
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>
Для меня разрешить эту расширяемость только для объектов ответа предпочтительнее, чем управление версиями веб-службы, поскольку оно позволяет вам разворачивать схему постепенно, если вы того пожелаете, без головной боли при управлении многими различными версиями и без беспокойства о все существующие клиенты прервутся, если вы добавите один новый атрибут или элемент к объекту ответа.