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
}
我的网络服务有一个返回测验的方法,当然可能包含问题和章节,其中可能包含问题和其他章节,依此类推。但是,当我生成WSDL时,只有Child和Quiz才会进入。当我调用Web服务时,我会返回一个具有正确数量的子项的Quiz元素,但它们都是Child元素,并且它们都是空的
有没有一种很好的方法来完成这项工作,而不仅仅是将XML作为String返回?
在有人要求之前,由于我无法控制的情况,我无法使用JAX-WS。
解决方案
我不认为JAX-RPC会以这种方式支持多态。我遇到了类似的问题,并且必须通过创建一个只有两个成员的类来解决它 - 一个可能返回的两个类中的一个 - 并且只根据我想要返回的类型填充一个。所以在你的情况下:
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
}
我知道,这需要客户检查孩子的哪个成员,并且非常丑陋。
其他提示
也许有人还在寻找它,可以在轴1.4上完成:
-
将下一行添加到您的轴Web服务部署文件(wsdd)部分:
<parameter name="emitAllTypesInWSDL" value="true" />
-
修改ant build file中的任务以包含'extraClasses':
<axis-java2wsdl ... extraClasses="..."></axis-java2wsdl>
在extraClasses中提及将要传递的所有类,因为axis无法猜测您将作为参数传递/返回的子项。
醇>
完成后,现在您可以在方法中传递派生类接受父类。等:
// 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.
不隶属于 StackOverflow