2012-03-14 15 views
0

DOMの代わりにストリームを使用しているため、xs:any要素のJAXB動作を変更する方法を探していました。巨大な(ギガバイト)データファイル/ストリームを処理できるようにする必要があります。JAXBバインディング - @XmlAnyElementで使用するDomHandlerを定義する方法

JAXBは、@ XmlAnyElementアノテーションを使用してanyプロパティを生成します。独自のストリーム実装を使用しているため、JAXBがanyプロパティを生成するのを避ける必要があります。しかし、JAXBバインディングにxs:any要素を無視するように指示することは不可能です。

このトピックについての私の現在の研究では、使用されるDomHandlerを書くことができるとわかりました。今、このDomHandlerは次のようになります場合:

StreamHandler implements DomHandler<MyStream, StreamResult> 

我々は、次の当社生成されたクラスへのストリーム・ロジックを追加することなく、仕事をするために、このDomHandlerを使用することができます。これで、生成されたany-propertyを再利用できるようになりました。

@XmlAnyElement(StreamHandler.class) 

を次のように

DomHandlerを設定する必要があります。しかし、私は、生成@XmlAnyElement注釈でこのDomHandlerを使用するXJB-ファイルを結合JAXBに定義することができますか?

編集:

私はこのrequestを提出し、この問題を解決するためにJAXBのmaven-pluginのアドオンを実装しました。このアドオンを基本アドオンバンドルに追加するように要求することができます。

答えて

0

これが本当にあなたの問題を解決する正しい方法であるかどうかはわかりません。

あなたが実際に望むのは、XJCがバインディング時にいくつかのプロパティを "無視"するようにすることです。現時点では可能ではないと思いますが、JAXBプラグインで解決できます。 file a requestをお願いします。

あなたのアプローチとあなたの質問に戻ってください。 @XmlAnyElementのDOMハンドラをカスタマイズするための "ネイティブ"カスタマイズはありませんが、Annotate Pluginを使用すると、生成されたクラスの任意の注釈を追加/変更できます。ここでは、この機能を実証テストプロジェクトは次のとおりです。

https://svn.java.net/svn/jaxb2-commons~svn/basics/trunk/tests/annotate/

すなわち、

<jaxb:bindings node="xs:complexType[@name='issueJIIB39CType']/xs:attribute[@name='test']"> 
    <annox:annotate target="field"> 
     <annox:annotate 
      annox:class="javax.xml.bind.annotation.XmlAttribute" 
      required="false"/> 
    </annox:annotate> 
</jaxb:bindings> 

あなたは@XmlAnyElementと同じことを行うことができますようになりWLL:このカスタマイズは、生成@XmlAttribute注釈にrequired = trueが追加されますが作る

<jaxb:bindings node="..."> 
    <annox:annotate target="field"> 
     <annox:annotate 
      annox:class="javax.xml.bind.annotation.XmlAnyElement" 
      value="com.acme.foo.StreamHandler"/> 
    </annox:annotate> 
</jaxb:bindings> 
+0

ご返信いただきありがとうございます。あなたの提案の問題は、StreamHandlerを使用してDomHandler を実装する場合、プロパティのタイプを変更する必要があることです。任意のプロパティの型は今T1になります。 getterメソッドとsetterメソッドのシグネチャも同様に調整する必要があり、アノテーションプラグインはこの作業を実行できません。 – user498380

関連する問題