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
xmlnswsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlnswsp="http://www.w3.org/ns/ws-policy"
xmlnswsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlnswsam="http://www.w3.org/2007/05/addressing/metadata"
xmlnssoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlnstns="http://jaxws.chiroito/"
xmlnsxsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://jaxws.chiroito/"
name="JaxWsSampleService">
<types>
<xsdschema>
<xsdimport namespace="http://jaxws.chiroito/"
schemaLocation="http://localhost:7001/weblogic-jaxws/JaxWsSampleService?xsd=1"/>
</xsdschema>
</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 wsamAction="http://jaxws.chiroito/JaxWsSample/helloRequest" message="tns:hello"/>
<output wsamAction="http://jaxws.chiroito/JaxWsSample/helloResponse" message="tns:helloResponse"/>
</operation>
</portType>
<binding name="JaxWsSamplePortBinding" type="tns:JaxWsSample">
<soapbinding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="hello">
<soapoperation soapAction=""/>
<input>
<soapbody use="literal"/>
</input>
<output>
<soapbody use="literal"/>
</output>
</operation>
</binding>
<service name="JaxWsSampleService">
<port name="JaxWsSamplePort" binding="tns:JaxWsSamplePortBinding">
<soapaddress 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();
}
}