2

2005 年以降、かなり大きな POJO ドメイン モデルを段階的に構築しています。また、XSD も同じ時間枠で段階的に開発しています。現在、次の方法で xmlbeans を使用して、HTTP 経由で WebService 応答の一部として送信される xml を生成しています。

  1. xmlbeans を使用して XSD からバインディング コードを生成する
  2. 自分のドメイン POJO からバインド コードを入力するマッパーをたくさん作成しました (逆も同様です)。
  3. XML にマーシャリングする
  4. Web サービスの場合、xmlbeans によって生成されたシリアライゼーション/デシリアライゼーション ファクトリを使用できる Axis 1.4 を使用します。これにより、XML over HTTP と SOAP/HTTP の 2 つのエンドポイントで同じコードを再利用できます。

現在、JAXB は成熟しており、標準であり、マルチテナンシー (少なくとも Moxy 実装) をサポートしており、xmlbeans の一部としての作業はあまり行われていないため、JAXB の使用を開始したいと考えています。だから私の質問は

  1. バインディング コードを生成せずに JAXB を使用する方法。つまり、マッピング コード (ステップ 2) を作成したり維持したりしたくありません。どうにかして JAXB を使用して、自分のドメイン POJO に直接非整列化できるかどうか疑問に思っていますか?
  2. これを WebService と統合するにはどうすればよいですか? 私の Web サービスは同じスキーマを使用しており、マッピングを複製したくありません。
  3. 他にベストプラクティスの提案はありますか?
  4. 知っておくべき教訓/教訓はありますか?
4

1 に答える 1

2

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

1 - バインディング コードを生成せずに JAXB を使用する方法。つまり、マッピング コード (ステップ 2) を作成したり維持したりしたくありません。どうにかして JAXB を使用して、自分のドメイン POJO に直接非整列化できるかどうか疑問に思っていますか?

独自のドメイン オブジェクトを使用するための鍵は、パス ベースのマッピングです。これがなければ、バインディング フレームワークで使用されるモデルは XML ドキュメントに非常に似ている必要があります。以下は、単純な住所オブジェクトがGoogle Geocoding API V2の結果にマッピングされているサンプルです。

package blog.geocode;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="kml")
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
    private String street;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
    private String city;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
    private String state;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
    private String country;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
    private String postalCode;

}

以下は、同じオブジェクト モデルが Google と Yahoo の両方の天気サービスにマップされている例へのリンクです。


2 - これを WebService と統合するにはどうすればよいですか? 私の Web サービスは同じスキーマを使用しており、マッピングを複製したくありません。

Axis が複数の JAXB プロバイダーをサポートしている場合、多くの構成を行わなくても MOXy を利用できるはずです。jaxb.propertiesドメイン モデルと同じパッケージにファイルを追加するだけで可能性があります。


3 - その他のベスト プラクティスの提案はありますか?

コンパイル時の依存関係をドメイン モデルに追加したくない場合は、メタデータを XML として表現することを検討してください。


アップデート

以下は、コメントを介して行った質問に対する回答です。

私が知っている Web サービス API の制限の 1 つは、「xjc によって生成されたファクトリ」に対して機能することです。その場合、XPath マッピングを使用できなくなったと思います。間違っている場合は修正してください。また、注釈を使用する場合でも xjc を使用する必要がありますか?

CXF についてはよくわかりませんが、標準の JAX-WS 実装では、独自のドメイン モデルから開始することも、XJC を介してドメイン モデルを生成することもできます。以下は、Java オブジェクトから開始するときに JAX-WS 環境で MOXy を使用する例です。


これは、XPath を使用する以外の別のオプションであり、マルチテナンシーをサポートする必要がある場合の唯一のオプションでもあると思います。

外部マッピング ドキュメントは XPath に代わるものではなく、メタデータを指定する別の方法です。オブジェクトから XML またはオブジェクトから JSON への変換以外に使用されるクラスに MOXy 依存関係を導入したくない場合は、このアプローチを好む人もいます。マルチテナンシーの場合、私はよくすべての共有プロパティに注釈を付けてから、テナントごとにマッピング ドキュメントを作成して拡張機能をマッピングします。


また、XPath ルートを使用した場合、または XML でメタデータを選択した場合、パフォーマンスへの影響はありますか?

パス ベースのマッピングの使用によるパフォーマンスへの影響はありません。が初期化されると、これはすべて最適化されJAXBContextます。外部バインディング ドキュメントのブートストラップを行う場合JAXBContext、少し多くの作業が行われるため、作成は少し遅くなりますが、JAXB/MOXy は例外的に構成されているため、これらのドキュメントは小さい傾向があります。Marshaller/Unmarshaller外部マッピング ドキュメントの使用による影響はありません。

于 2012-07-31T20:00:26.767 に答える