Axis1.4とAxis2.1.4の連携で引数がずれる
WebService(Soap)のお話。
Axis 1.4とAxis2 1.4で連携していたが、
Axis2のほうで、minOccurs=0, maxOccurs=1のパラメータに対して値を設定しないで送信すると、
その設定しない値が詰まって引数がずれる。
Axisのほうがサーバーで
Axis2のほうがクライアント
例えば、Axisのサーバー側でこんなメソッドがある
public String test(String str1, String str2, String str3) { System.out.println("str1 = " + str1); System.out.println("str2 = " + str2); System.out.println("str3 = " + str3); return str1 + str2 + str3; }
これにAxis2のクライアントでメッセージを作って送信する。
public void test() { TestServiceStub stub = new TestServiceStub(); Test request = new Test(); request.setStr1("hoge"); request.setStr2("piyo"); request.setStr3("fuga"); TestResponse response = stub.test(request); }
とすると、サーバー側の受け取ったデータは、
str1 = hoge
str2 = piyo
str3 = fuga
になる。
これは成功。
しかし、クライアント側の設定を
public void test() { TestServiceStub stub = new TestServiceStub(); Test request = new Test(); // request.setStr1("hoge"); request.setStr2("piyo"); request.setStr3("fuga"); TestResponse response = stub.test(request); }
とすると、サーバー側の受け取ったデータが
str1 = piyo
str2 = fuga
str3 = null
となっちまう。
str2に入れたものがstr1に入っていて、str3に設定したものがstr2に入っている。
あれやこれやと調べたところ
[AXIS2-4492] Parameter shift in REST - ASF JIRA
こんなの見つけた。
どうやら、Axis2.1.4では、同じような現象があるらしい。
ということで、クライアント側をAxis2 1.5にして同様のテストをしてみた。
が!!!
結果は一緒でした。
まぁ、サーバーが同じだから当然といえば当然。
Axis1.4同士の連携では、オブジェクトにセットしないで送信するため、問題はない。
やっぱり、Axis1.4とAxis2 1.4の連携では、
public void test() { TestServiceStub stub = new TestServiceStub(); Test request = new Test(); request.setStr1(null); request.setStr2("piyo"); request.setStr3("fuga"); TestResponse response = stub.test(request); }
こんな風にnullとか空文字を意図的に設定してあげないと駄目なようだ。