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 のクライアントはスタブを使用することでサービスへアクセスします。クライアントの開発者は次の手順でサービスへアクセスするアプリケーションを作成します。
- WSDLの確認
- クライアントでスタブの自動作成
- クライアントアプリでスタブを使用
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(); } }