2009年4月1日水曜日

Axis2でUnexpected subelement

Axis2で作成したWeb Serviceを公開し、クライアントから叩いてみたところ、Unexpected subelementというメッセージとともにまったく動かない。あるメソッド(サービス)だけが動かず、他のメソッドは正常に動いているので、結構やっかいな問題っぽい。また、クライアントを.netに変えてみたところ、同じエラーで終了。ただし、Unexpected subelementの後ろの文字、すなわちエレメント名は異なっていた。

いろいろと実験してみたところ、どうもサーバーにはSOAPメッセージはきちんと送られ、Axis2内の処理の中には入っているものの、その中でエラーが起こっている模様。もっと具体的には、SOAPからオブジェクトに変換するところでエラーが起きているようだ。

Axis2のサーバー側では、SOAPからオブジェクトに変換された後、Skeleon.jaraの対応するメソッドが呼ばれる。通常は、このクラスだけを編集すればよい。ただし、今回のエラーのように、このSkeletonに来る前にエラーが起きている場合は、もっと前段階を調べる必要がある。

前段階、つまりSOAPメッセージは、最初Axis2内部のロジックを通り、MessageReceiverInOut.javaのinvokeBusinessLogicに渡される。ここで受け取ったメソッド名から、対応するリクエストを生成する処理が呼ばれる。つまり、HTTPリクエストのXMLをパースし、オブジェクトを作成する。このパース処理は、それぞれのオブジェクトのFactoryのparseメソッドで行われる。

では、実際にparseメソッドを見てみると、ここで、"Unexpected sublement "というエラーメッセージとExceptionを生成していることがわかる。どうやら、ここでSOAP(XML)のparseに失敗していたようだ。

というわけで、デバッガを使い、送られてきたSOAPメッセージをチェックしてみると、問題のエレメントには何もはいっていないことが判明。問題のエレメントはオブジェクトの入れ子になっていたため、単純なNullPointerExceptionが発生し、それがparse Errorになり、わけのわからないメッセージなっていたようだ。

というわけで、クライアント側のプログラムで、nullとなっていたところをきちんと埋めたら、、、正常に動いた。

0 コメント: