JAXB XmlIDおよびXmlIDREFアノテーション(スキーマからJava)
質問
CXFを使用してWebサービスを公開しています。 @XmlIDおよび@XmlIDREF JAXBアノテーションを使用して、マーシャリング/アンマーシャリング中にオブジェクトグラフの参照整合性を維持しています。
WSDLには、これを表すxs:idおよびxs:idref属性を持つ要素が含まれています。
サーバー側では、すべてが本当にうまく機能します。 @XmlIDREFアノテーションが付けられたタイプのインスタンスは、@ XmlIDアノテーションが付けられたものと同じインスタンス(==など)です。
ただし、WSDLToJavaを使用してクライアントを生成する場合、参照(@XmlIDREFで注釈が付けられている参照)はjava.lang.Object型です。
参照のタイプがjava.lang.String(参照されるタイプのIDと一致する)または参照されるタイプ自体と同じになるようにJAXBバインディングをカスタマイズする方法はありますか?
解決 3
OK、だからこれは機能しません。スキーマが参照のタイプを指定できず、IDREFが異なる複雑なタイプを指している可能性があるため、JAXBがIDREFの正しいタイプでコードを生成することはできません。 JAXBは、参照のタイプをどのように知るのでしょうか? XMLスキーマの拡張機能で実現できます! :)
他のヒント
インラインJAXBバインディングを使用して、使用するタイプを示します。 JAXBで生成されたコードは正しいタイプになります。
<complexType name="Column">
<sequence>
<element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0">
<annotation>
<appinfo>
<jaxb:property>
<jaxb:baseType name="Column"/>
</jaxb:property>
</appinfo>
</annotation>
</element>
</sequence>
<attribute name="id" type="ID" use="required"></attribute>
</complexType>
schema
要素で jaxb
名前空間とJAXBバージョンを宣言する必要があることにも注意してください。
<schema targetNamespace="http://example.com/schema"
elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
以下は、少なくともxs:IDREF型の要素/属性の文字列プロパティを作成するようです。良いスタートですが、理想的には、JAXBは参照されている要素と同じタイプのプロパティを生成します。その方法を見つけた場合、いつ報告します。この結果は、残念なことに、独自のコンバーターを作成する必要があることを示している可能性があります。
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings>
<jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" />
</jxb:globalBindings>
</jxb:bindings>