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オブジェクトを適切な値に変換する必要があります。
以下のフォーマットで変換されます。
-
- yyyy-MM-dd'T'HH:mm:ss.SSS'Z'