Eclipse + WTPを使って、WEBサービスの開発をプロトしてみました。プリミティブオブジェクト以外の型についても、正しくWSDLとプロキシクライアントが作成され、使い物になるものが生成されることが確認できました。
WEBサービス開発の流れは
といった感じになります。
動的Webプロジェクト
プロジェクト名 : WebServicesSamplesWeb Content Directory: war Source Deirectory: source
EARプロジェクト
プロジェクト名 : WebServicesSamplesEAR
例として
を持つ nu.mine.kino.services.HelloWorld クラスを作成し、これをWEBサービスとして公開したいと思います。
package nu.mine.kino.services;
/**
* @author Masatomi KINO
* @version $Revision$
*/
public class HelloWorld {
public String sayHello() { // Stringを返す
return "Hello";
}
public String[] sayHellos() { // String[] を返す
return new String[] { "Hello World.", "hello world." };
}
public Model getModel() { // Model を返す
return new Model();
}
}package nu.mine.kino.services;
/**
* @author Masatomi KINO
* @version $Revision$
*/
public class Model {
public String getName() {
return "なまえ";
}
}次にWTPを使って、JavaBeansからWSDLなどなどを作成していきます。パッケージエクスプローラからHelloWorldを選択して右クリックし Create Web services を選択します。そうすると下のようなダイアログが表示されます。
このダイアログで
Web Service Type: Bottom up Java Bean Web Service Generate a proxy にチェック Install Web Service client on server は外す
など選択して、次へ進みます。ちなみに一般的に
Bottom up Java Bean Web Service: JavaBeansからWSDL作成 Top down Java Bean Web Service: WSDLからJavaBeans作成
という意味だそうです。
次画面ではBeansを選択する画面です。このままHelloWorldを選択して、次へ進みます
次は公開するWEBサービスをどのWebプロジェクトにDeployするか、またクライアントプロキシをどのプロジェクトに配置するかを指定します。Client Project typeは Java Utility Project にしておきます。
次に公開するメソッドを選択します。下のように選択し、次に進みます。
ここまできて、ようやくWEBプロジェクトにWSDLファイルが作成されます。J次の画面で、JBossをスタートしますかと聞いてくるので、サーバをスタートさせます。自動的にEARプロジェクトがデプロイされ、WEBサービスが公開された状態になります*1。
あとは次へ次へと進んでいけばさっき指定したJavaProjectにプロキシクライアントが配置され、全て完了です。
最終的に上のようなディレクトリ構造になります。
いま、WEBサービスが公開されている状態なので、実際にテストクラスを作って稼動確認してみます。プロキシが置かれたプロジェクト内で以下のMainクラスを作成します。
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import nu.mine.kino.services.HelloWorld;
import nu.mine.kino.services.HelloWorldServiceLocator;
import nu.mine.kino.services.Model;
public class Main {
public static void main(String[] args) {
try {
HelloWorld helloWorld = new HelloWorldServiceLocator()
.getHelloWorld();
System.out.println(helloWorld.sayHello());
String[] hellos = helloWorld.sayHellos();
for (int i = 0; i < hellos.length; i++) {
System.out.println(hellos[i]);
}
Model model = helloWorld.getModel();
System.out.println(model.getName());
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
実行結果は以下のようになります。
2006/04/25 17:36:29 org.apache.axis.utils.JavaUtils isAttachmentSupported 警告: 要求されたクラス(javax.activation.DataHandler と javax.mail.internet. MimeMultipart)が見つかりません。Attachmentサポートが利用できません。 / [en]-(Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.) Hello Hello World. hello world. なまえ
なんか警告が出てますが、Stringも配列もJavaBeansも正しく稼動していることが確認できました!!
さて、ここまでで既存のJavaBeansをWEBサービスとして公開するところまでができました。あとは公開したWEBサービスを、デプロイしたりアンデプロイするantのbuildスクリプトを作成しておこうと思います。
<?xml version="1.0" encoding="UTF-8"?>
<project name="WebServices Deploy" basedir=".">
<property file="build.win.properties" />
<property file="build.properties" />
<!--
http://ws.apache.org/axis/java/ant/ant.html
-->
<path id="axis.classpath">
<fileset dir="${web.lib.dir}" includes="*.jar" />
<fileset dir="${axis.dir}/lib" includes="*.jar" />
</path>
<taskdef resource="axis-tasks.properties" classpathref="axis.classpath" />
<target name="deploy">
<axis-admin port="8080" hostname="localhost" failonerror="true"
servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.deployfile}" />
</target>
<target name="undeploy">
<axis-admin port="8080" hostname="localhost" failonerror="true"
servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.undeployfile}" />
</target>
</project>
wsdd.dir=war/WEB-INF/HelloWorldService/nu/mine/kino/services
wsdd.deployfile=${wsdd.dir}/deploy.wsdd
wsdd.undeployfile=${wsdd.dir}/undeploy.wsdd
web.lib.dir=war/WEB-INF/lib
axis.dir=C:/javatools/axis
axisservlet=WebServicesSamplesWeb/servlet/AxisServletApache Axisにはサーバとの通信をキャプチャするTCPモニタが同梱されています。Eclipseから、メインクラス名:org.apache.axis.utils.tcpmon で起動できます。
つかいかたですが、今までは
クライアント(接続先:8080) -> (ポート:8080)サーバ
という接続でしたが、あいだにこのツールをかますためにはクライアントの接続先ポート番号を例えば
クライアント(接続先:8081) -> (ポート:8081)tcpmon(接続先:8080) -> (ポート:8080)サーバ
と変更する必要があります。つまりクライアントのプロクシが接続しに行くサーバのポート番号を変更する必要があるのですが、それは
HelloWorldServiceLocator#setHelloWorldEndpointAddress
("http://localhost:8081/WebServicesSamplesWeb/services/HelloWorldService")
というエンドポイントを変更するメソッドで行うことができます。
参考:
この記事は
javax.xml.rpc.Stub jaxrpcStub = (javax.xml.rpc.Stub) getVendorSpecificStub(); jaxrpcStub._setProperty(javax.xml.rpc.Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);みたいだけど、そもそもプロクシがAxis依存だから、まあいっかー -- きの 2006-06-09 09:36:52 (金)
((Stub) service)._setProperty(
javax.xml.rpc.Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
でできるね。serviceは new HelloWorldServiceLocator().getHelloWorld();の返り値ね。-- きの 2006-06-09 09:46:15 (金)現在のアクセス:67115