wsdlの形式

axisでサービスを公開する際にwsdlの形式を選択することができる。
server-config.wsddのserviceタグに設定するstyle属性のことだが、有効な形式はwrapped/document/rpcの3種類かな?

一般的なのはdocumentらしいのだが、リクエストデータを表す構造体に妙な別名がつく。
普通は単に「request」となるはずが、「request」「request1」「request2」・・・とメソッドごとに連番がつく。
そのくせ、WSDL2Javaツールで自動生成したクラスを使ってアクセスしようとすると「request2」なんて知らないよ的なエラーを返す。


だもんでwrappedを試したところ、配列で問題が出た。


documentの時は配列をシリアライズすると<プロパティ名>・・・・・・
のように、配列要素のxml要素名はitemになっていた。
ところがwrappedでは<プロパティ名><プロパティ名>・・・<プロパティ名>・・・
のように同じ名前の要素が二重になった。
WSDL2Javaで自動生成したクラスからはアクセスできていたので大して気にしなかったのだが、WEBサービスの本当のクライアントからxmlの解析に失敗するというクレームがついてしまった。


axisのソースから、シリアライズの時にxml要素名がどこで決まるのかを調べたところ、RPCParamとArraySerializerで決めていることがわかった。
細かいところまでは覚えていないが、styleがdocumentの場合RPCParamクラスで一律配列要素のxml要素名をitemに設定している。
ArraySerializerクラスはRPCParamが上記設定をしていない場合、プロパティ名と同じ名前を使用するようになっている。


どうすれば汎用的なものになるか良くわからなかったので、とりあえず配列要素のxml要素名はすべてitemとするようにArraySerializerをちょっだけ改造して使うことにした。


本当はどうするのが正解なんだろうか・・・?


ちなみにstyleをrpcにするとどうなったかは覚えていない。
試してみたはずなんだけど・・・