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とか空文字を意図的に設定してあげないと駄目なようだ。