コンシューマ作成

前回、サービスの作成方法を書いたので、今度は、クライアントの作成方法を書こうかと思います。
前回作成したサービスを呼び出すクライアントを作成したいと思います。
基本的には、途中まで、サービスと一緒で、WSDLからソースを自動生成します。
前回作成した、WSDLbuild.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();
   }
}