Glassfish v2 で Metro Web サービスの一部として JAXB を使用している場合、JAXB に次を追加するように指示するにはどうすればよいですか。
<xsd:any/> and <xsd:anyAttribute/>
生成された複雑なタイプにタグを付けて、将来変更を加えて応答オブジェクトに要素または属性を追加しても、現在のクライアントが壊れないようにします。
JAXB のドキュメントはやや不足しているようです。
Glassfish v2 で Metro Web サービスの一部として JAXB を使用している場合、JAXB に次を追加するように指示するにはどうすればよいですか。
<xsd:any/> and <xsd:anyAttribute/>
生成された複雑なタイプにタグを付けて、将来変更を加えて応答オブジェクトに要素または属性を追加しても、現在のクライアントが壊れないようにします。
JAXB のドキュメントはやや不足しているようです。
java.lang.Object タイプを使用するだけです。JAXB はデフォルトで xsd:any を生成します。戻り値の型として java.lang.Object を使用して、Web サービス メソッドから org.w3c.dom.Node インスタンスを正常に返しました。xsd:anyAttribute に似たようなものがあると思います-おそらくオブジェクトの戻り値の型と XmlAttribute JAXB 注釈を使用していますか?
追加: 次の注釈は、目標を達成しているように見えます。どちらも JAXB 2.0 仕様の一部です。
@XmlAnyAttribute @XmlAnyElement
これが私がそれを機能させた方法です:
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>
私にとっては、応答オブジェクトに対してのみこの拡張性を許可することは、必要に応じてスキーマを少しずつ進化させることができるため、Web サービスのバージョン管理よりも望ましいことであり、多くの異なるバージョンを管理するという頭痛の種や、既存のクライアントを心配する必要はありません。単一の新しい属性または要素を応答オブジェクトに追加すると壊れます。