2008-10-29 44 views
4

我有一個需要返回複雜多態值的JAX-RPC(Java)Web服務。更具體地講,階級結構是這樣的:JAX-RPC 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。

回答

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 
} 

這就需要客戶端檢查孩子的成員被填充其中,而且是可怕的醜陋,我知道了。

+0

這是hacktastic,但它可能是最好的方式來做到這一點,仍然使用Java對象。現在我只需要決定這樣做還是簡單的XML。 – 2008-10-30 14:17:16

1

也許有人還在尋找它,它可以在軸1.4來完成:

  1. 在下一行添加到您的Axis Web服務部署文件的部分(WSDD):

    <parameter name="emitAllTypesInWSDL" value="true" /> 
    
  2. 在ant構建文件中修改您的任務以包含'extraClasses':

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

    In extraClass menti在所有將被傳遞的類上,因爲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.