我有一个需要返回复杂多态值的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上完成:

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

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. 修改ant build file中的任务以包含'extraClasses':

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

    在extraClasses中提及将要传递的所有类,因为axis无法猜测您将作为参数传递/返回的子项。

  3. 完成后,现在您可以在方法中传递派生类接受父类。等:

    // 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.
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top