現在、XML スキーマでSpring LDAP フィルターをモデル化しようとしています。これには、任意にネストできるポリモーフィック型が含まれます。
<andFilter>
<notFilter>
<equalsFilter name="mail" value="asfd@example.com" />
</notFilter>
<likeFilter name="mail" value="asdf*" />
</andFilter>
これは、xsd で上記のフィルターを定義する方法です (実際にはいくつかの中間抽象型が定義されていますが、簡単にするためにそれらを省略しています)。
<xsd:complexType name="baseFilterType" abstract="true" />
<xsd:element name="filter" type="tns:baseFilterType" />
<xsd:complexType name="andFilterType">
<xsd:sequence>
<xsd:element ref="tns:filter" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="andFilter" type="tns:andFilterType" substitutionGroup="tns:filter" />
<xsd:complexType name="notFilterType">
<xsd:sequence>
<xsd:element ref="tns:filter" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="notFilter" type="tns:notFilterType" substitutionGroup="tns:filter" />
<xsd:complexType name="likeFilterType">
<xsd:sequence>
<xsd:element ref="tns:attributeName" />
<xsd:element ref="tns:value" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="likeFilter" type="tns:likeFilterType" substitutionGroup="tns:filter" />
<xsd:complexType name="equalsFilterType">
<xsd:sequence>
<xsd:element ref="tns:attributeName" />
<xsd:element ref="tns:value" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="equalsFilter" type="tns:equalsFilterType" substitutionGroup="tns:filter" />
JAXBElement<? extends BaseFilterType>
(ビジター パターンを実装するために) いくつかのカスタム動作を使用して各フィルター クラスを拡張しましたが、生成されたクラス全体で使用される代わりに、JAXB をそれらにバインドする方法がわかりません。
JAXB モデル クラスはビルド時に生成されるため、それらを直接変更することはできません。カスタマイズには外部カスタム バインディングを使用する必要があります。implClass
とカスタマイズを試みましたが、そのbaseClass
方法を理解できませんでした。
誰でも助けることができますか?
編集:マーシャリングとアンマーシャリングにSpringのセットを使用してJaxb2Marshaller
います。contextPaths
これがオブジェクトのインスタンス化に利用されることを期待してObjectFactory
いましたが、そうではないようです。
編集 2:フィルター要素は、次のように、最上位の要素と相互に参照されます。
<xsd:element name="GetAttributesRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="filter:filter" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
そのため、GetAttributesRequest
オブジェクトは でマークされますが@XmlRootElement
、フィルター クラス自体はマークされません。ただし、トップレベルのGetAttributesRequest
オブジェクトでさえインスタンス化されていませんObjectFactory
...