web-dev-qa-db-ja.com

wsimportが生成したクライアントはどのように機能しますか?

何よりも先に、Webサービスサーバーに既に接続できることを知ってほしい。この質問をしているのは、wsimportで生成されたクライアントがどのように機能するかについて、より深い知識を得たいからです。私の研究に基づいて、wsimportはJAXWSを使用します。 JAXWSの知識がないことに注意してください。

Wsimportを使用してクライアントを生成しました。使用したWSDLはAxis2 Webサービスからのものであり、Axis2によって自動的に生成されました。以下のクラスは、wsimportの結果です。

com.datamodel.xsd

  • DataBeanRequest.Java
  • DataBeanResponse.Java
  • ObjectFactory.Java
  • package-info.Java

com.service

  • MyWebService.Java
  • MyWebServicePortType.Java
  • MyMethod.Java
  • MyMethodResponse.Java
  • ObjectFactory.Java
  • package-info.Java

上記のクラスを使用すると、com.datamodel.xsdには、Webサービスサーバーで使用されるBeanが含まれます(ObjectFactoryおよびpackage-info)。一方、MyMethodMyMethodResponseは、Webサービスのメソッド/オペレーションのリクエストとレスポンスのパラメーターを設定するために使用されるBeanです。

以下は私の質問です:(私の質問のいくつかの答えがわからない場合、あなたは本当にすべてに答える必要はありません。:)そして、あなたが役に立つと思う情報を気軽に共有してください。

私は正しいですか

  • 上記の仮定で正しいですか?
  • 他のクラスの機能は何ですか?
  • MyWebServiceを調べたところ、クライアントの生成に使用したWSDLの絶対的な場所を参照する注釈が含まれています。クライアントでwsdllocationを指定することの関連性は何ですか?クライアントはその情報をどのように使用しますか?
  • Webサービスの実際のURLは、生成されたどのクラスでも宣言されていないことに気付きました。クライアントは、接続する必要がある場所をどのように知るのですか?
  • 接続時にクライアントがWSDLファイルのURLを読み取れるように、WSDLファイルに注釈が付けられていましたか?その場合、新しい接続を確立する必要がある場合、WSDLファイルが常に読み取られるということですか?
  • アプリケーションをコンパイルして別のサーバーにインストールする必要があるため、無効になります。絶対パスではなく相対パスに設定できますか?どうやって? (回答:はい、相対パスに設定できます。wsimportコマンドにはwsdllocation属性があり、wsdllocationの値を指定できます。)
  • HTTPSに接続する必要がある場合はどうなりますか。サーバー証明書を設定するにはどうすればよいですか?
  • Wsimportを使用してクライアントを生成する場合と、Axis2またはApache CXFを使用して生成する場合に違いはありますか。
29
Arci

質問に答える前に、いくつかの明確化:JAX-WSはJavaでWebサービスを実装するための仕様です。 WSDLアーティファクトをJavaクラスにマッピングする方法、およびこのマッピングをアノテーションを使用して適用する方法について説明します。 仕様をここからダウンロードしてください 。wsimportツールはこの仕様のリファレンス実装とリファレンス実装はJavaクラスライブラリの一部です。Axis2、CXF、Metroなど、基本的なJAX-WSサポートを強化する代替実装がいくつかあります。 WS-ReliableMessagingやWS-Securityなどの追加標準のサポート。

あなたの質問に今:

上記の仮定で正しいですか?

はい、そうです。

他のクラスの機能は何ですか?

package-infoは、Webサービスで使用されるXML名前空間を、実装クラスが存在するパッケージにマップするために存在します。名前空間は通常、Javaパッケージ名(通常はURL))とは異なるように見えるため、マッピングが必要になります。

ObjectFactoryを使用すると、サービスで送受信されるメッセージを作成できます。これは、スタブクラスの前にコードをフックし、変更されたメッセージまたは同様のものを提供する場合に必要です。

私はあなたのクラスの内容を見ることができませんが、私が正しく理解すればMyWebServicePortTypeはあなたのWSDLのportTypeに似たインターフェースです。つまり、WSDLの操作とその署名をJavaメソッドにマッピングします。サービスを提供したい場合(クライアントに問い合わせているのではない場合)、このインターフェイスを実装する必要があります。クライアントを実装するときは、単にそれを使用します。

最後に、クラスMyWebServiceには、Webサービスを呼び出す場合に必要なクライアントスタブが含まれています。

MyWebServiceを調べたところ、クライアントの生成に使用したWSDLの絶対位置を参照する注釈が含まれています。クライアントでwsdllocationを指定することの関連性は何ですか?クライアントはその情報をどのように使用しますか?

生成したインターフェイスには、サービスのportTypeの署名が含まれていますが、サービスと通信する方法については説明していません。これは、WSDLのバインディングの一部です。最も基本的な設定は、HTTPを介したSOAPを使用したメッセージのドキュメント/リテラル​​スタイルです。JMSを介したSOAPなどのその他の構成が可能です。使用するプロトコルを知る必要があります。したがって、バインディングWSDLが必要です。また、後で述べるように、Javaファイルにエンドポイントアドレスがありません。このアドレスもWSDLから読み取られます。

Webサービスの実際のURLは、生成されたどのクラスでも宣言されていないことに気付きました。クライアントは、接続する必要がある場所をどのように知るのですか?

WSDLのaddressportからserviceを読み取ります。これは、WSDLの終わりにあります。

接続時にクライアントがWSDLファイルのURLを読み取れるように、WSDLファイルに注釈が付けられていましたか?

いいえ、portは具体的なWebサービスエンドポイントの典型的な要素です。ここには特別な必要はありません。

その場合、新しい接続を確立する必要がある場合、WSDLファイルが常に読み取られるということですか?

まあ、クライアント側にキャッシュがある可能性があります(この実装のリファレンス実装の詳細については知りません)。概念的な観点から:はい、そうです。

HTTPSに接続する必要がある場合はどうなりますか。サーバー証明書を設定するにはどうすればよいですか

これは難しい場合があります。すぐに答えられるわけではありません。このトピックに関する質問を読むことをお勧めします このようなもの

Wsimportを使用してクライアントを生成する場合とAxis2またはApache CXFを使用して生成する場合に違いはありますか

はいあります。 wsimportの方が優れています。wsdl2Javaを使用しないでください。 ここに説明、理由

45
joergl

あなたが尋ねました:Webサービスの実際のURLは、生成されたクラスのいずれでも宣言されていないことに気付きました。クライアントは、接続先をどのように知るのですか?

WSDLがブラウザを使用してダウンロードされ、入力としてwsimportに渡された場合、ローカルのwsdlファイルの場所は生成されたコード。そのため、生成されたコードに実際のサービスの場所が表示されません。また、wsdlファイルのローカルコピーを削除した場合、生成されたコードは動作しません(mainメソッドを使用してinovkedした場合)。

WsdlのURLがwsimportへの入力として渡された場合、そのURLは生成されたコードに埋め込まれます。実際のサービスの場所を取得するために使用されます。考えは、WSDLの場所が固定されているということです。これらは、UDDI内またはローカルファイルとして存在することが期待されています。これにより、実際のサービスを自由に移動できます。移動する場合は、wsdlファイルのローカルコピーのみを変更するか、UDDIのwsdlを更新するだけです。 [サービスの場所はIPではなくDNS名であるため、ほとんど発生しません]

これが、Webサービスが実行されているのと同じサーバーでwsdlを公開することは決して良い考えではない理由です

3
krish