2010-12-18 4 views
1

私は制御できない外部ソースからxsdを取得しました。今度は、JAXB生成クラスにカスタムメソッドを追加して、ゲッターとセッターを持つ単純なPOJOではなく、オブジェクト自体についてもっと知るようにしたいと考えています。JAXB生成クラスにカスタムビヘイビアを追加する方法。既存のメソッドをオーバーライドしないカスタム

このタイプのアプローチを実装したら、水和オブジェクトをドリルダウンする必要はありませんが、カスタムメソッドを呼び出す必要がある特定の情報をオブジェクトに問い合わせて、

もちろん、私は、ルートオブジェクトの子供の子供たちを掘り下げ、各子供にゲッターメソッドを呼び出し、ビジネスロジックを実装する伝統的なプログラミングアプローチがあります。しかし、どういうわけか、ここのチームはそれを望んでいない。

私がこれまで行ってきたアプローチの1つはブルートフォース1です。私はJAXBを使用してXSDからクラスを生成します。私は外部のユーティリティを持っています(これはスタンドアロンのJavaプログラムです)。実行すると、特定のディレクトリにあるテキストファイル(独自の方法で、どのメソッドを.javaファイルに移動するかを調べるために構造化されています)カスタムメソッドを保持し、これらのメソッドを適切なJAXB生成クラスに移動します。新しいバージョンのXSDが得られるたびに、クラスを生成し、このユーティリティを呼び出し、おそらくJAXB生成クラスにいくつかの変数の変更がある場合のコンパイルの問題などを解決する必要があります。ユーティリティは完全に正常に動作しています。しかし、私はこれを知りたい。

これを行うにはもっと良い方法はありますか?私はインターネットをチェックした。いくつかのソリューションがありますが、JAXBで生成されたオブジェクトの既存のgetメソッドをオーバーライドするだけで、完全に新しいメソッドを追加することはありません。

お勧めします。

答えて

1

「最もクリーンなアプローチ」は、ソースコードレベルではなく実行時に記述することを行うAspect Oriented Programming(AOP)を使用することです。メソッドをクラスに挿入します。 AOPの可能な実装の1つはAspectJ

XMLシーマが複雑すぎない場合に可能な第2の代替方法は、その周りにラッパーを作成することです。

すでに説明した3番目の方法です。しかし、自分で何かをコーディングするのではなく、標準のツールに頼ることができます。標準のdiff/patchツールを使用することをお勧めします。コードスタイルが修正されている限り、既存の変更されたJavaファイルからdiffを作成し、新しく生成されたJAXBコードに適用するのはあまり複雑ではありません。

関連する問題