2011-11-21 10 views
9

複数のWebサービス(複数のWSDL)を持つプロジェクトに対して、トップダウンアプローチを採用しています。各Webサービスは別々のプロジェクトとしてセットアップし、別々の戦争として展開する必要があります。wsimport - 別々のプロジェクト/フォルダでサービスエンドポイントクラスとJAXBクラスを生成する方法

問題は、WSDLがいくつかの共通の.xsdファイルを共有することです。現在、WSDLごとにwsimportを実行すると、共通のJAXBクラスが各Webサービスプロジェクトで重複しています。

理想的には、共通の共有プロジェクトでJAXBクラスを別々に生成し、それぞれのWebサービスプロジェクトでJAXBクラスプロジェクトを再利用したいが、wsimportはJAXBクラス生成をスキップするオプションを提供しないOR JAXBクラスの別の場所を指定します。

さまざまなJAX-WS Webサービスエンドポイント間でJAXBクラスをどのように共有できるかについての考えはありますか?

+1

私は思うが(これは間違っているかもしれませんが)両方のオプションが可能ではありません.JAXBの生成は、生成されるためにはさまざまなスタブに依存しているのでスキップすることはできません。別のディレクトリは、すべてのインポートのためのオプションではありません。私の最高の推測は、あなたがthis.But私は間違っている可能性があります自分自身(手動)コードをリファクタリングする必要があるということです。誰かがこれを確かに知っているかどうかを見てみましょう – Cratylus

+0

あなたのIDEは何ですか? –

+0

@ChrisAldrichこのプロジェクトにはIBM RAD 7.5.5を使用しています – PrasadB

答えて

10

私はこの質問は非常に古いと知っていますが、私は探している人の答えを共有したいと思いました。私は答えを見つけるのに私がしばらくかかったことを知っています。

JAXB 2.1 RIの時点で、これを容易にするために使用できる「エピソード」という機能があります。

myschema.xsdというスキーマがあるとします。

xjc -episode myschema.episode myschema.xsd 

これは、1回の呼び出しで複数のxsdファイルをコンパイルする場合にも機能します。呼び出しによってバインディングとmyschema.episodeファイルが生成されます。

エピソードファイルは特別なバインディングファイルです。あなたがそのようにように、wsimportので、このファイルを使用することができます。

wsimport mywsdl.wsdl -b myschema.episode 

wsimportのは、以前に生成JAXBファイルを使用し、欠けている何かを生成します。

詳細については、this pageを参照してください。

0

mavenを使用している場合は、プラグインを使用してそれを行うことができます。

すべてのJAXBとサービスクラスを生成し、サービスのプロジェクトでそれらを格納します。私はのIBM Rationalツールセットを使用して見てきた通常何
Using the JAXB XJC Maven 2 Plugin

1

。その後、JAXBを再生成してクライアントクラスをサービスし、クライアントプロジェクトに格納します。

はい、これは重複しています。しかし、私はそれの背後にある理由は、それがサービスプロバイダとサービス消費者の懸念を分けることだと思う。ツールセットの観点からは、クライアントが.NET、C++、Javaのいずれであるかをどのように知ることができますか?またはその逆。あなたがクライアントであれば、プロバイダが.NET、C++、Javaなどであるかどうかをどのように知ることができますか?あなたはそうしない。したがって、IBMはこのような懸念の分離方法を提供します。

これは、サービスプロバイダとコンシューマの両方のソースがある場合、コードが重複してしまうという欠点があります。これは維持する痛みである可能性があります。

サービスやクライアントをJavaプロジェクト(J2EEプロジェクトやWebプロジェクトではない)に生成し、そこからjarファイルを作成するのが最善でしょう。このように、すべてのJAXBクラスがそこにあります(そして1回だけです)。 WSDLはそこにあります(一度)。このサービスは一度存在し、EARまたはWARのいずれかでサーバーにデプロイできます。クライアントは、あなたがサービスを消費するように他の人にそれを与えたい場合に備えて存在します。クライアントがWSDLの場所に基づいて動的に作成できる場合は、さらに優れています。

私は、ウィザード駆動の観点から、a post that may helpを持っています。それはよりセキュリティに関連していますが、そこからいくつかの役に立つヒントを見つけることができます。

4

JAXB/JAX-WSカスタマイズを使用してこれを達成できます。 XSDタイプにWSDLに埋め込まれているとします。次に、あなたのカスタマイズが次のようになります。

<jaxws:bindings version="2.0" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    wsdlLocation="../wsdl/some.wsdl"> 

    <jaxws:package name="org.company.project.ws" /> 

    <!-- XSD types customization within WSDL --> 
    <jaxb:bindings node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxws:bindings> 

上記の構成は、次のプロジェクトのディレクトリ構造を参照する:あなたはorg.codehaus.mojo:jaxws-maven-pluginプラグインを使用する場合は、<bindingDirectory>binding</bindingDirectory>を指定する

+-- binding 
| +-- jaxws-binding.xml 
+-- wsdl 
| +-- some.wsdl 
+-- src 
    ... 

必要です。

あなたのXSDはWSDLの外部にある場合は、その後、あなたが個別にカスタマイズを指定する必要があります。

+-- binding 
| +-- jaxb-binding.xml 
| +-- jaxws-binding.xml 
+-- wsdl 
    ... 

その後jaxb-binding.xmlは、次のようになります。Antのビルドについて

<jaxb:bindings version="1.0" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <jaxb:bindings schemaLocation="my.xsd" node="//xsd:schema"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="org.company.project.beans" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 
  • あなたは、単に2を生成しますさまざまなパッケージの瓶。私は個人的にあなたがproject-beansプロジェクトでXSDからJAXBクラスを生成し、project-wsプロジェクト削除にwsimportの後JAXBクラスを生成するための最も簡単な解決策は以下のようになり、その後:) 1つのMavenプロジェクトから2つのJARアーティファクトを作成する方法を知らないので
  • (あなたはそれのためのantのプラグインを使用することができます)実行します。
+1

非常に便利です。特に、インポートされたスキーマに別のバインディングファイルが必要です。ありがとうございました! –

関連する問題