Axisでmultirefを無効にする方法
多重参照でエンコーディングされると困る場合に、多重参照での送受信を不可に設定したいのだが、WSDDの中のglobalConfiguration要素でsendMultiRefsをfalseに設定してもWSDLに変化無し。多重参照のEnvelopeを送ってもちゃんと返ってきてしまうし、生成されたWSDLからWSDL2Javaで生成したスタブも多重参照形式でデータを送信している。どうやってOFFにするんだ・・・。WSDLからSOAPEncoding要素をはずすと単一参照で送受信してくれるけど、自動生成されるWSDLに反映させる方法が分からず。調べ中。
#追記
スタブのLocatorをnewした所で下記のように直接指定したら効いた。設定ファイルでやるにはどうするんだ?WSDLに反映するにはどうするんだ?styleとuseをいじり中。もう手で作ったWSDLでも良い気がしてきた・・・。
locator.getEngine().setOption("sendMultiRefs", Boolean.FALSE)
#追記
できたできた。ドキュメント見たら書いてありました。これが正規手順ですね。
<service name="xxx" provider="java:RPC" style="document" use="literal">
styleとuseを指定した事でだいぶシンプルなEnvelopeになりました。さて、次はnull値の時に要素を書き出さない設定はどうするんだろう?nillableが関連しているに違いない。
#追記
nillable属性を消す方法は無いのかも?プリミティブ型だったら出力しないようになっているけれど、それ以外の型の場合はtrueと出力する事になってる。空タグは出力しないようにするにはどうすればいいんだ・・・手書きのWSDLならできてるのにー。
#追記
よーやっと理解した!空タグを出力しないようにするには、elementにminOccurs="0"の指定が必要ってことだ。AxisはminOccursが1以上の場合は設定された値がnullでも空タグを出力しますし、minOccursを指定しないかつnullableが指定されていない or falseの場合はnullを設定するとクライアントでエラーになる。さて、ここで問題だ。Axisが自動生成するURLにoccursとかdefaultの指定を追加するにはどうすればいい!?これこの間も悩んだんだよな〜。とりあえず手書きのWSDLでは完成している。