JAX-WSでのコンシューマ作成
前回、サービスの作成方法を書いたので、今度は、クライアントの作成方法を書こうかと思います。
前回作成したサービスを呼び出すクライアントを作成したいと思います。
基本的には、途中まで、サービスと一緒で、WSDLからソースを自動生成します。
前回作成した、WSDLとbuild.xmlを使いまわします。
バッチからの呼び出しにしようと思うので、少し、build.xmlを編集します。
編集後のbuild.xmlです。
<?xml version="1.0" encoding="UTF-8"?> <project name="MessageServiceClient"> <property name="project.name" value="MessageService"/> <property name="version" value="1_0"/> <property name="revision" value="1"/> <property name="build.lib" value="lib/"/> <property name="build.src" value="src"/> <property name="build.gen" value="gen"/> <property name="build.bin" value="bin"/> <property name="build.dist" value="dist"/> <property name="build.wsdl" value="http://localhost:8080/MessageService_1_0/MessageService?WSDL"/> <path id="classpath"> <fileset dir="${build.lib}"> <include name="*.jar"/> </fileset> </path> <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> <classpath refid="classpath"/> </taskdef> <target name="wsimport"> <wsimport wsdl="${build.wsdl}/${project.name}_${version}.wsdl" destdir="${build.bin}" sourcedestdir="${build.gen}" keep="true" verbose="true"/> </target> </project>
編集したbuild.xmlを利用し、antでwsimportを実行して、ソースを自動生成します。
さっそく、実装ですが、SOAPサービスを呼び出しに利用するクラスは、自動生成されたソースを利用します。
まず、サービス呼び出しのスタブを生成するクラスを作成します。
public class MessageServiceFactory { public static MessageService getMessageService(String wsdlLocation) throws MalformedURLException { URL baseUrl = MessageService_Service.class.getResource("."); URL url = new URL(baseUrl, wsdlLocation); QName serviceName = new QName("http://developer.co.jp/system/dev/wsdl/MessageService_1_0", "MessageService"); return new MessageService_Service(url, serviceName).getMessageService(); } }
スタブクラスを生成するクラスの作成が完了したら、
次に、実際にSOAPサービスを呼び出すクラスを作成します。
リクエスト及びレスポンスは、自動生成されたソースのクラスを利用します。
今回は、MessageRequestクラスがリクエスト用で、MessageResponseクラスがレスポンス用になります。
まず、リクエストの作成ですが、自動生成されたソースの中にオブジェクトファクトリがあります。
それを利用して、リクエストクラスのオブジェクトを生成します。
// ファクトリを生成 ObjectFactory factory = new ObjectFactory(); // リクエストの生成 MessageRequest request = factory.createMessageRequest();
JAX-WSのタイムスタンプ型は、XMLGregorianCalendarクラスでマッピングされていますので、
参考程度に生成方法も書いておきます。
// ファクトリの生成 DatatypeFactory dataTypeFactory = DatatypeFactory.newInstance(); // XMlGregorianCalendarの生成 XMLGregorianCalendar calendar = dataTypeFactory.newXMLGregorianCalendar(); // 年を設定 calendar.setYear(2010); // 月を設定 calendar.setMonth(6); // 日を設定 calendar.setDay(5); // 時間を設定 calendar.setTime(23, 1, 1);
最終的なテストクラスは、下記になります。
public class Test { public static void main(String[] args) { String wsdlLocation = "http://localhost:8080/MessageService_1_0/MessageService?WSDL"; try { MessageService clinet = MessageServiceFactory.getMessageService(wsdlLocation); ObjectFactory factory = new ObjectFactory(); MessageRequest request = factory.createMessageRequest(); request.setMessageId(100); DatatypeFactory dataTypeFactory = DatatypeFactory.newInstance(); XMLGregorianCalendar calendar = dataTypeFactory.newXMLGregorianCalendar(); calendar.setYear(2010); calendar.setMonth(6); calendar.setDay(5); calendar.setTime(23, 1, 1); request.setActionDt(calendar); MessageResponse response = clinet.getMessage(request); System.out.println(response.getMessage()); }catch(Exception ex) { ex.printStackTrace(); } }