Seasar DI Container with AOP

S2XML-RPC サンプル

本ドキュメントは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>

コンポーネントをXML-RPCとして公開する

POJOのクラスをXML-RPCとして公開することが可能です。

その際、以下の制限があります。

  • 公開するメソッドは戻り値なし(void)は使用できません。(XML-RPCの仕様の制限)
  • 日付時刻クラス(java.util.Dateなど)はミリ秒以下が切り捨てられます。(XML-RPCの仕様の制限)
  • BeanはXML-RPCのプロトコルではMapにマッピングされます。

Echoサンプル

サービスとして公開するクラス
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>

Pingサンプル

サービスとして公開するクラス
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>

特定のインタフェースを公開する(S2XML-RPC V0.3.0では未実装の機能です)

実装クラスを公開すると、不要なメソッドまで公開されてる場合があります(インタフェースを実装していない場合や複数のインタフェースを実装している場合など)。実装クラス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>

引数/戻り値としてBeanを使用する

このサンプルでは、サービスは引数および戻り値の型として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
}