3

次の手順に従って、Web サービスを作成しました。

  • @WebService および @WebMethod アノテーションを使用してサービス インターフェイスと実装を作成
  • サービスをデプロイしました
  • wsimport で生成されたクライアント スタブ
  • 次のようなクライアント プログラムで呼び出された Web サービス:

    public static void main(String[] args) throws Exception {
    
      URL url = new URL("http://SERVER:PORT/HelloWorldPOC/HelloWorldPOCImplService?wsdl");
    
      QName qname = new QName("http://helloworld.poc.com/", "HelloWorldPOCImplService");
    
      Service service = Service.create(url, qname);
    
      HelloWorldPOCImpl hello = service.getPort(HelloWorldPOCImpl.class);
    
      hello.execute("hello");
    
      System.out.println("Done");
    }
    

質問:

  1. WSDL の場所は、クライアント プログラムで提供されます。WSDL の場所は、wsimport によって生成されたクライアント スタブにもハードコーディングされています。この冗長性はなぜですか?
  2. 「localhost」パスを使用して wsimport を使用してクライアント スタブを作成しました。

    wsimport -keep http://localhost:9080/HelloWorldPOC/HelloWorldPOCImplService?wsdl
    
    • URLサーバー部分を「localhost」として、localhostからクライアントテストプログラムを実行しました。出来た。次に、サーバーのホスト名としてサーバー部分を使用して、別のシステムから同じクライアントを実行しました。出来た。
    • これは、生成されたクライアント スタブ内の WSDL の場所が使用されていないことを意味しますか?
    • また、localhost で WSDL を生成し、クライアント スタブを再生成せずにどこにでもデプロイできるのでしょうか? デプロイされたサーバーから WSDL を取得する必要があるのは、呼び出し元のクライアントだけです。これは受け入れられている慣行ですか、それともデプロイされたサーバーごとにクライアントを再生成する必要がありますか?
4

1 に答える 1

2
  1. 99% 上書きされるデフォルトの場所として理解できます。生成されたコードでは、wsdl URL を指定しなくてもサービスを作成できるため、デフォルトの URL が使用されます。
  2. wsdl ファイルのデフォルトの URL アドレスをオーバーライドすると、もちろんそれは使用されません。多くの場合、Web サービス プロデューサーは wsdl ファイルのみを提供し、ローカル ハード ドライブに配置された wsdl からスタブを生成するため、常にデフォルト値をオーバーライドする必要があります。

PS: スタブを生成せずに Web サービスを呼び出す方法について、別のテクニックをうわさ話できます。クライアントで利用可能な「リモートインターフェイス」のようなものだけが必要です(サーバークラスによって実装されます)。これは、Web サービスの作成と使用を担当する場合に非常に効率的です。インターフェイスを変更するときにスタブを再生成する必要がないため、インターフェイスが進化するときに非常に効率的です。サーバーとして JBoss 7 (JAX-WS) を使用し、クライアントで Apache CXF ライブラリを使用する例を次に示します。 7

于 2013-05-10T17:13:30.650 に答える