11

複数のWebサービス(複数のWSDL)を使用するプロジェクトにはトップダウンアプローチを使用しています。各Webサービスは、個別のプロジェクトとして設定し、個別の戦争として展開する必要があります。

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

理想的には、共通の共有プロジェクトでJAXBクラスを個別に生成してから、各WebサービスプロジェクトでJAXBクラスプロジェクトを再利用する必要がありますが、wsimportには、JAXBクラスの生成をスキップするオプションや別の場所を指定するオプションはありません。 JAXBクラスの場合。

異なるJAX-WSWebサービスエンドポイント間でJAXBクラスを共有する方法について何か考えはありますか?

4

4 に答える 4

14

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

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ファイルを使用するようになり、欠落しているものはすべて生成されます。

詳細については、このページを参照してください。

于 2012-04-30T21:30:36.183 に答える
7

これは、 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>

上記の構成は、次のプロジェクト ディレクトリ構造を参照しています。

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

プラグインを使用する場合はorg.codehaus.mojo:jaxws-maven-plugin、指定する必要があります<bindingDirectory>binding</bindingDirectory>

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

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

次にjaxb-binding.xml、次のようになります。

<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>
  • Ant ビルドの場合、異なるパッケージ用に 2 つの jar を生成するだけです。
  • 私は個人的に、1 つの Maven プロジェクトから 2 つの JAR アーティファクトを作成する方法を知らないので :) 最も簡単な解決策は、project-beansプロジェクトでXSD から JAXB クラスを生成project-wsし、wsimport の実行後に生成された JAXB クラスをプロジェクトで削除することです (使用できます)。そのためのantプラグイン)。
于 2011-11-21T15:46:32.853 に答える
1

通常、IBM Rational ツールセットを使用して私が見たもの:

すべての JAXB およびサービス クラスを生成し、それらをサービス プロジェクトに格納します。次に、JAXB およびサービス クライアント クラスを再生成し、それらをクライアント プロジェクトに格納します。

はい、これは重複です。しかし、その背後にある理由は、サービス プロバイダーとサービス コンシューマの関心を分離するためだと思います。ツールセットの観点から、クライアントが .NET、C++、または Java のいずれであるかをどのように判断しますか? またはその逆。あなたがクライアントである場合、プロバイダーが .NET、C++、または Java などであるかどうかをどのように知ることができますか? あなたはそうしない。したがって、IBM は、このような関心の分離方法を提供します。

これの欠点は、サービス プロバイダーとコンシューマーの両方のソースがある場合、コードが重複することです。これは、維持するのが面倒な場合があります。

したがって、サービスとクライアントを (J2EE プロジェクトや Web プロジェクトではなく) Java プロジェクトに生成し、そこから jar を作成するのがおそらく最善でしょう。このようにして、すべての JAXB クラスが存在します (しかも 1 回だけ)。WSDL はそこにあります (1 回)。サービスは一度存在し、EAR または WAR のいずれかでサーバーにデプロイできます。また、サービスを利用するために誰かにそれを提供したい場合に備えて、クライアントが存在します。クライアントが WSDL の場所に基づく動的な作成を許可している場合は、さらに優れています。

ウィザード主導の観点から、それを支援する投稿があります。よりセキュリティに関連していますが、役立つヒントがいくつか見つかるかもしれません。

于 2011-11-21T15:34:15.677 に答える
0

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

于 2011-11-21T13:51:46.603 に答える