31

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

wsimportを使用してクライアントを生成しました。私が使用したWSDLはAxis2Webサービスからのものであり、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)が含まれていることがわかります。一方、MyMethodおよびMyMethodResponseは、Webサービスのメソッド/操作の要求および応答パラメーターを設定するために使用されるBeanでもあります。

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

私は正しいですか

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

2 に答える 2

46

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

今あなたの質問に:

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

はい、そうです。

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

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

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

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

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

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

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

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

WSDLののaddressからを読み取ります。これは、WSDLの最後にあります。portservice

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

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

もしそうなら、それは新しい接続を確立する必要があるときにWSDLファイルが常に読み取られることを意味しますか?

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

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

これは注意が必要な場合があります。すぐに使用できる答えを提供することはできません。このトピックなど、このトピックに関する質問を一読することをお勧めします。

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

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

于 2012-09-03T13:04:19.257 に答える
3

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

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

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

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

于 2013-03-15T11:21:09.203 に答える