本ドキュメントはS2XML-RPC について記述しています。
S2XML-RPCExamplesは、S2XML-RPCの基本的な機能を一通り使用したサンプルです。インストールについてはセットアップを参照してください。
ソースはサーバ側とクライアント側に分かれており、クライアント側はJUnit (S2Unit) のテストケースとして作成されています。それぞれ、以下のソースフォルダにあります。
- サーバ側
src/java フォルダのorg.seasar.xmlrpc.examples パッケージ
- クライアント側
src/tsst フォルダのorg.seasar.xmlrpc.examples パッケージ
クライアント側では、リモート呼び出しの設定を、以下のdiconファイルで共通化しています。
s2xmlrpc-client.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
"http://www.seasar.org/dtd/components23.dtd">
<components>
<component name="remoting"
class="org.seasar.remoting.common.interceptor.RemotingInterceptor">
<property name="connector">connector</property>
</component>
<component name="connector"
class="org.seasar.remoting.xmlrpc.connector.XmlRpcConnector">
<property name="baseURL">baseURL</property>
</component>
<component name="baseURL" class="java.net.URL" autoBinding="none">
<arg>"http://localhost:8080/s2xmlrpc-examples/xmlrpc"</arg>
</component>
</components>
POJOのクラスをXML-RPCとして公開することが可能です。
その際、以下の制限があります。
- 公開するメソッドは戻り値なし(void)は使用できません。(XML-RPCの仕様の制限)
- 日付時刻クラス(java.util.Dateなど)はミリ秒以下が切り捨てられます。(XML-RPCの仕様の制限)
- BeanはXML-RPCのプロトコルではMapにマッピングされます。
サービスとして公開するクラス
public interface Echo {
String echo(int id, String message);
}
public class EchoImpl implements Echo {
public String echo(int id, String message) {
return "[id = " + id + "] " + message;
}
}
dicon(サービス側)
<component name="Echo" class="org.seasar.remoting.xmlrpc.examples.ex01.EchoImpl">
<meta name="xmlrpc"/>
</component>
dicon(クライアント側)
<include path="s2xmlrpc-client.dicon"/>
<component class="org.seasar.remoting.xmlrpc.examples.ex01.Echo">
<aspect>remoting</aspect>
</component>
サービスとして公開するクラス
public interface Ping {
boolean ping(String message);
}
public class PingImpl implements Ping {
public void ping(String message) {
System.out.println(message);
return true;
}
}
dicon(サービス側)
<component name="Ping" class="org.seasar.remoting.xmlrpc.examples.ex01.PingImpl">
<meta name="xmlrpc"/>
</component>
dicon(クライアント側)
<include path="s2xmlrpc-client.dicon"/>
<component class="org.seasar.remoting.xmlrpc.examples.ex01.Ping">
<aspect>remoting</aspect>
</component>
実装クラスを公開すると、不要なメソッドまで公開されてる場合があります(インタフェースを実装していない場合や複数のインタフェースを実装している場合など)。実装クラスHelloImpl は二つのインタフェースを実装していますが、MessageSettableのメソッドsetMessage(String) はXML-RPCとして公開しないものとします。
このような場合には、公開するJavaインタフェースを指定します(実装したインタフェースが一つだけの場合や、実装した複数のインタフェースのメソッドを全て公開する場合には明示的に指定する必要はありません)。
<component name="Hello" class="org.seasar.remoting.xmlrpc.examples.ex02.impl.HelloImpl">
<meta name="xmlrpc">
<component class="org.seasar.remoting.xmlrpc.ServiceDef">
<property name="serviceType">@org.seasar.remoting.xmlrpc.examples.ex02.Hello@class</property>
</component>
</meta>
<property name="message">"Hello"</property>
</component>
このサンプルでは、サービスは引数および戻り値の型としてJavaBeansを使用しています。プリミティブ型(およびそのラッパクラス型)を使用している場合は、特に何も指定しなくても動作します。
public interface BeanEcho {
EchoDto echo(EchoDto echoDto);
}
public class BeanEchoImpl implements BeanEcho {
public BeanEchoImpl() {}
public EchoDto echo(EchoDto echoDto) {
return echoDto;
}
}
public class EchoDto {
private String strParam = "";
private short shortParam = 1;
private int intParam = 2;
private long longParam = 3L;
private float floatParam = 1.0f;
private double doubleParam = 1.1;
private boolean boolParam = true;
// setter/getter
}
|