Axis2でRPC通信をする際の問題 その1

java.util.Calender がサービスの引数にあると送信メッセージが適切に作成されない

Axis2 1.0 では、Calenderオブジェクトの deserialize に問題があるようです。
ちなみに、この問題はクライアントからの送信(サービスのメソッドコール)時のみだけで、サービスの戻り値が Calender の場合は問題なく処理されます。deserialize の処理が異なっているんだよね orz

  • サービス
public int sendCalendar(Calendar cal);
  • クライアント
Calendar cal = Calendar.getInstance();
RPCServiceClient client = new RPCServiceClient();
OMElement response = client.invokeBlocking(new QName("sendCalendar"), new Object[]{cal});
  • 発生する例外
Caused by: java.lang.NumberFormatException: badDate00
	at org.apache.axis2.databinding.typemapping.SimpleTypeMapper.makeCalendar(SimpleTypeMapper.java:227)
	at org.apache.axis2.databinding.typemapping.SimpleTypeMapper.getSimpleTypeObject(SimpleTypeMapper.java:97)
	at org.apache.axis2.databinding.utils.BeanUtil.processObject(BeanUtil.java:436)
	at org.apache.axis2.databinding.utils.BeanUtil.ProcessElement(BeanUtil.java:402)
	at org.apache.axis2.databinding.utils.BeanUtil.deserialize(BeanUtil.java:359)
	at org.apache.axis2.rpc.receivers.RPCUtil.processRequest(RPCUtil.java:82)
	at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:103)


送信メッセージが以下のようになってしまうのが問題です(一部省略)。Calender#toString()の結果が設定されてしまっています。

<?xml version='1.0' encoding='UTF-8'?>
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header />
  <soapenv:Body>
    <ns:sendCalendar xmlns:ns="http://ex01.examples.axis2.remoting.seasar.org/xsd">
      <arg0>
        java.util.GregorianCalendar[time=1154964715687,areFieldsSet=true, ・・・
      </arg0>
    </ns:sendCalendar>
  </soapenv:Body>
</soapenv:Envelope>


回避策としては、以下のメソッドを利用して、Calenderオブジェクトを適切な値に変換する必要があります。

    • org.apache.axis2.databinding.typemapping.SimpleTypeMapper#getStringValue(Object obj)

以下のフォーマットで変換されます。

    • yyyy-MM-dd'T'HH:mm:ss.SSS'Z'