#chiroito ’s blog

Java を中心とした趣味の技術について

JAX-WS アプリケーションの開発(スタブの自動作成、スタブの使用)

JAX-WS のクライアントから次のJAX-WSのクラスを使用するまでの流れを紹介します。

package chiroito.jaxws;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class JaxWsSample {

    @WebMethod
    public String hello() {
        return "Hello World";
    }
}

JAX-WS のクライアントはスタブを使用することでサービスへアクセスします。クライアントの開発者は次の手順でサービスへアクセスするアプリケーションを作成します。

  1. WSDLの確認
  2. クライアントでスタブの自動作成
  3. クライアントアプリでスタブを使用

WSDL の確認

クライアントが使用するスタブを自動生成するには WSDL が必要です。上記クラスを含んだアプリケーションをデプロイして WSDL を確認しましょう。
WSDL はブラウザで専用の URL へアクセスすることで確認できます。この URL はhttp://<APサーバ>/<アプリのコンテキストルート>/JaxWsSampleService?wsdlになります。今回は、アプリケーションサーバをlocalhost:7001で動かし、コンテキストルートはweblogic-jaxwsに設定しているため次の URL にアクセスします。
http://localhost:7001/weblogic-jaxws/JaxWsSampleService?wsdl

WSDL の URL が分からない場合は、アプリケーションサーバが Oracle WebLogic Server では、Administration Console を使うことで WSDL の一覧を見られます。 左側のメニューで[デプロイメント]を選択すると、デプロイされているアプリケーションの一覧が表示されるので、上記クラスが含まれているアプリケーションを選択して設定画面へ進みます。設定画面の[概要]タブが表示されているので、画面上部の[テスト]タブを選択するとアプリケーションの[テスト・ポイント]の一覧が表示されるので上記クラスのテスト・ポイントである[?WSDL]を選択しましょう。

今回は以下の WSDL が作成されています。

<definitions
 xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
 xmlns:wsp="http://www.w3.org/ns/ws-policy" 
 xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" 
 xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:tns="http://jaxws.chiroito/" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns="http://schemas.xmlsoap.org/wsdl/" 
 targetNamespace="http://jaxws.chiroito/"
 name="JaxWsSampleService">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://jaxws.chiroito/"
 schemaLocation="http://localhost:7001/weblogic-jaxws/JaxWsSampleService?xsd=1"/>
    </xsd:schema>
  </types>
  <message name="hello">
    <part name="parameters" element="tns:hello"/>
  </message>
  <message name="helloResponse">
    <part name="parameters" element="tns:helloResponse"/>
  </message>
  <portType name="JaxWsSample">
    <operation name="hello">
      <input wsam:Action="http://jaxws.chiroito/JaxWsSample/helloRequest" message="tns:hello"/>
      <output wsam:Action="http://jaxws.chiroito/JaxWsSample/helloResponse" message="tns:helloResponse"/>
    </operation>
  </portType>
  <binding name="JaxWsSamplePortBinding" type="tns:JaxWsSample">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="hello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="JaxWsSampleService">
    <port name="JaxWsSamplePort" binding="tns:JaxWsSamplePortBinding">
      <soap:address location="http://localhost:7001/weblogic-jaxws/JaxWsSampleService"/>
    </port>
  </service>
</definitions>

クライアントでスタブの自動作成

JDK に含まれているwsimportコマンドを使用して WebService に接続するスタブを作成します。Java のソースファイル(-Xnocompile)を指定したディレクトリ(-s <生成先ディレクトリ>)に作成し、既存のコードがあれば残します(-keep)。指定したパッケージ(-p <生成先パッケージ>)として WSDL に記載されているクラスを作成します。

wsimport -Xnocompile -s <生成先ディレクトリ> -keep -p <生成先パッケージ>  <WSDLのURL>

今いる場所から相対パスでsrc/main/javaの位置に、otherapp.jaxws.stubパッケージとしてJaxWsSampleServiceのスタブを作成するには下記の様に実行します。

wsimport -Xnocompile -s src/main/java -keep -p otherapp.jaxws.stub http://localhost:7001/weblogic-jaxws/JaxWsSampleService?WSDL
WSDLを解析しています...
コードを生成しています...

スタブとして以下のソースコードが作成されます。

ls src/main/java/otherapp/jaxws/stub
Hello.java  HelloResponse.java  JaxWsSample.java  JaxWsSampleService.java  ObjectFactory.java  package-info.java

クライアントアプリでスタブを使用

作成されたスタブは下記の様にクライアント側のアプリケーションで使用することが出来ます。

package otherapp.jaxws;

import otherapp.jaxws.stub.JaxWsSample;
import otherapp.jaxws.stub.JaxWsSampleService;

import javax.enterprise.context.RequestScoped;
import javax.xml.ws.WebServiceRef;

@RequestScoped
public class JaxWsSampleClient {

    @WebServiceRef(JaxWsSampleService.class)
    private JaxWsSample service;

    public String hello() {
        return service.hello();
    }
}