4

複雑なポリモーフィック値を返す必要がある JAX-RPC (Java) Web サービスがあります。より具体的には、クラス構造は次のようになります。

abstract class Child {
}

class Question extends Child {
    private String name;
    // other fields, getters, and setters
}

class Section extends Child {
    private String label;
    private Child[] children;
    // getters and setters
}

class Quiz {
    private Child[] elements;
    // getter and setter
}

私の Web サービスには、クイズを返すメソッドがあります。もちろん、クイズには、質問とセクションが含まれている可能性があり、質問と他のセクションが含まれている可能性があります。ただし、WSDL を生成すると、Child と Quiz だけが入ります。Web サービスを呼び出すと、適切な数の子を持つ Quiz 要素が返されますが、それらはすべて Child 要素であり、すべて空です。 .

XMLを文字列として返すだけでなく、これを機能させる良い方法はありますか?

誰かが尋ねる前に、私の手に負えない状況のため、私は JAX-WS を使用できません。

4

2 に答える 2

1

JAX-RPC がそのようなポリモーフィズムをサポートしているとは思いません。同様の問題があり、2 つのメンバー (返される可能性のある 2 つのクラスのそれぞれに 1 つずつ) を持つクラスを作成し、戻りたい型に応じて 1 つだけを設定することで回避する必要がありました。だからあなたの場合:

class Child 
{
    private Section section;
    private Question question;

   // Constructor, etc...
}

class Question 
{
    private String name;
    // other fields, getters, and setters
}

class Section 
{
    private String label;
    private Child[] children;
    // getters and setters
}

class Quiz 
{
    private Child[] elements;
    // getter and setter
}

これは、クライアントが子のどのメンバーが設定されているかを確認する必要があり、恐ろしく醜いことを私は知っています。

于 2008-10-30T09:44:57.397 に答える
1

誰かがまだ探しているかもしれませんが、軸 1.4 で実行できます。

  1. 次の行を、Axis Web サービス展開ファイル (wsdd) のセクションに追加します。

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. Ant ビルド ファイルのタスクを変更して、「extraClasses」を含めます。

    <axis-java2wsdl ... extraClasses="..."></axis-java2wsdl>
    

    extraClasses では、渡されるすべてのクラスについて言及します。軸は、パラメーターとして渡す/返す子を推測できないためです。

これで、親クラスを受け入れるメソッドで派生クラスを渡すことができます。等:

// server side class A { ...}
class B extends A {...}
class C extends A {...}

// ws
class wsAxis { public void processPolymorphCall(A obj); }

// client side
wsAxis.processPolymorphCall(new C());

// this will work now, as much as returning derivated classes in place of base class.
于 2009-11-11T14:23:41.253 に答える