JAX-RPC Webサービスの多態性
-
05-07-2019 - |
質問
複雑なポリモーフィック値を返す必要がある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を使用できません。
解決
JAX-RPCがそのように多態性をサポートするとは思わない。私は同様の問題を抱えていて、返される可能性のある2つのクラスのそれぞれに1つだけの2つのメンバーを持つクラスを作成し、返そうとする型に応じて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
}
どの子のメンバーが設定されているかをクライアントに確認する必要があり、ひどくugいです、私は知っています。
他のヒント
誰かがまだ探しているのかもしれませんが、軸1.4でそれを行うことができます:
-
軸Webサービスデプロイメントファイル(wsdd)のセクションに次の行を追加します。
<parameter name="emitAllTypesInWSDL" value="true" />
-
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.