3

ObjectFactoryスキーマと XML を最初に定義する可能性があるため、JAXB を操作するときに が自動的に生成されることが多いことを理解しています。しかし、これは私がプロジェクトにアプローチできる方法ではありません。

JAXB を使用して REST サービスと組み合わせて使用​​するには、注釈を付けて拡張する必要がある既存のコードがあります。私はほんの一握りのクラスしか持っておらず、すでにそれらに注釈を付けています。私がドキュメントを理解している限り (私は JAXB を初めて使用します)、ObjectFactoryパッケージ レベルでの自動呼び出し用のパッケージによる実装、またはパッケージ コンテキストによって参照されるのではなく直接参照される場合の多数の実装が必要です。

最善のアプローチが何であるかは少しわかりません。パッケージごとに 1 つの実装を使用する場合、マネージャーはかなり抽象的になり、多くのクラスをインスタンス化します。ただし、これが「正しい」方法であるかどうかはわかりません。個人的には、インスタンス化の懸念事項を の個別のインスタンスに分離することを選択しますObjectFactory。つまり、クラスごとに 1 つのファクトリを持ちます。したがって、Data Access Objectパターンに似たものを実装します。

私のエンジニアリングのバックグラウンドは、懸念事項を分離し、変更よりも拡張を選択することがより良い選択であることを教えてくれます。したがって、私の直感では、モノリシックObjectFactoryは、コードではなく XML から開始するアプローチの結果として生成された場合にのみ使用されます。しかし、私には十分な情報に基づいた選択をするための十分な経験がありません。

テクノロジと推奨事項に関する経験 (これは意見に基づくものです) だけでなく、このアプローチによって、私が見逃しているリスクや、JAXB に関する技術的な制限が発生する可能性があるかどうかについてもお尋ねしたいと思います。私は私の行動方針を追求します。ありがとうございました!

4

1 に答える 1

4

JAXBContextパッケージ名にを作成する

JAXBContextパッケージ名でを作成する場合:

JAXBContext jc = JAXBContext.newInstance("com.example.foo");

JAXB 実装はパッケージのスキャンを行わないため、モデルの残りの部分を派生できるパッケージ内の何かを見つける必要があります。これは次のいずれかです。

  1. ドメイン モデルを参照するメソッドを持つObjectFactoryクラス。createモデルが XML スキーマから生成されている場合は、このブートストラップが最適です。
  2. jaxb.indexブートストラップするクラスの短いクラス名 (パッケージ修飾されていない) の単なるキャリッジ リターン区切りのリストであるファイルJAXBContext。JAXB は参照されたクラスを取り込むため、これはリスト全体である必要はありません。Java クラスから開始する場合は、この方法を使用するのが最適です。

ObjectFactory使用目的

メタデータに関する限り、次のものObjectFactoryがあります。

  1. createドメインモデルを決定できる署名からのメソッド(ObjectFactory単独でブートストラップした場合.
  2. @XmlElementDecl注釈。注釈@XmlElementDeclは注釈に似て@XmlRootElementいますが、名前付きの型を持つ最上位要素の場合に使用されます ( http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.htmlを参照)。

ObjectFactory使用されないもの

は、ドメイン クラスのインスタンスを作成ObjectFactoryする操作中には使用されません。umarshal詳細については、以下にリンクされている質問を参照してください。

JAXBContextJAX-RS 環境での の作成

あなたはRESTをやっていると言いました。ContextResolverこれに JAX-RS 実装 (Jersey など) を使用している場合は、 を使用してを作成することをお勧めしますJAXBContext。以下は私のブログの例です。この例では、MOXy JAXB impl の拡張機能を使用してメタデータを提供していますが、必要に応じて作成することもできますJAXBContext

于 2014-11-13T10:15:43.223 に答える