注: 私は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
外部マッピング ドキュメントの使用による影響はありません。