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
}

我的网络服务有一个返回测验的方法,它当然可能包含问题和部分,其中可能包含问题和其他部分,依此类推。但是,当我生成 WSDL 时,只有 Child 和 Quiz 进入。当我调用 Web 服务时,我得到一个带有正确数量子元素的 Quiz 元素,但它们都是 Child 元素,并且它们都是空的.

除了将 XML 作为字符串返回之外,有没有一种很好的方法来完成这项工作?

在有人问之前,由于我无法控制的情况,我不能使用 JAX-WS。

4

2 回答 2

1

我不认为 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
}

这需要客户检查孩子的哪个成员被填充,并且非常丑陋,我知道。

于 2008-10-30T09:44:57.397 回答
1

可能有人还在找,可以在axis 1.4做:

  1. 将下一行添加到您的轴 Web 服务部署文件 (wsdd) 部分:

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. 修改 ant 构建文件中的任务以包含“extraClasses”:

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

    在 extraClasses 中提到了所有将被传递的类,因为轴无法猜测您将作为参数传递/返回的孩子。

完成,现在您可以在接受父类的方法中传递派生类。ETC:

// 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 回答