0

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

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

このトピックに関する現在の調査で、使用される DomHandler を作成できることがわかりました。この DomHandler が次のようになるとします。

StreamHandler implements DomHandler<MyStream, StreamResult>

この DomHandler を使用して、生成されたクラスの隣にストリーム ロジックを追加する必要なく、ジョブを実行できます。これで、生成された任意のプロパティを再利用できます。

DomHandler は次のように設定する必要があります。

@XmlAnyElement(StreamHandler.class)

しかし、生成された @XmlAnyElement アノテーションでこの DomHandler を使用するには、jaxb バインディング xjb-file でどのように定義すればよいでしょうか?

編集:

このリクエストを提出し、この問題を解決するために JAXB maven-plugin アドオンを実装しました。このアドオンを basics-addon バンドルに追加するようリクエストできます。

4

1 に答える 1

0

これがあなたの問題を解決するための本当に正しいアプローチであるかどうかはわかりません。

実際に必要なのは、XJCがバインド時に一部のプロパティを「無視」するようにすることです。現時点では不可能だと思いますが、JAXBプラグインで解決できます。リクエストを提出してください。

さて、あなたのアプローチとあなたの質問に戻りましょう。のDOMハンドラーをカスタマイズするための「ネイティブ」カスタマイズはありませんが、 Annotateプラグイン@XmlAnyElementを使用して、生成したクラスに任意のアノテーションを追加/変更できます。この機能を実証するテストプロジェクトは次のとおりです。

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

つまり、このカスタマイズによりrequired = true、生成された@XmlAttribute注釈が追加されます。

<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ようなもので同じことをすることができます:

<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>
于 2012-03-15T09:44:02.193 に答える