2009-02-13 72 views
3

我正在使用Axis來建模示例WebService。我現在正在做的是試圖瞭解哪些是自動wsdl和代碼生成的限制。axis wsdl generation

現在對於一些服務器端代碼:

這是樣本Web服務的骨架:

public class TestWebService { 
    public AbstractAttribute[] testCall(AbstractAttribute someAttribute) { 
    .... 

,我的數據類: 公共抽象類AbstractAttribute { 字符串名稱;

/*get/set for name*/ 
    public abstract T getValue(); 
    public abstract void setValue(T value); 
} 

public class IntAttribute extends AbstractAttribute<Integer> { 
    Integer value; 
    public Integer getValue(){ return value; } 
    public void setValue(Integer value){ this.value = value; } 
} 

public class StringAttribute extends AbstractAttribute<String> { 
    String value; 
    /* ok, you got the point, get/set for value field */ 
} 

爲Axis2的這次日食的工具是很樂意來從這些來源WSDL,包括架構爲屬性類,它是:這裏

<xs:complexType name="AbstractAttribute"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
     <xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="IntAttribute"> 
    <xs:complexContent> 
     <xs:extension base="xsd:AbstractAttribute"> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
<xs:complexType name="StringAttribute"> 
    <xs:complexContent> 
     <xs:extension base="xsd:AbstractAttribute"> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

現在,如果看到一些奇怪的事情,AbstractAttribute沒有** abstract =「true」**屬性,並定義了一個anyType值元素,它在IntAttribute和StirngAttribute中得到重寫。我甚至不知道這是否是一個合法的模式(順便說一句,我認爲它不合法)。

更多,如果我嘗試(總是使用Eclipse工具)將所生成的源不會編譯,因爲AbstractAttribute限定

Object localValue; 

字段和Int /字符串屬性定義

從該WSDL生成客戶端
int localValue; 

String localValue; 

..我試圖 「適應」 了源(顯然沒有很多希望),結果是服務器試圖實例化一個AbstractAttribute實例(拋出一個InstantiationException)。

所以我的問題是:有一種方法來模擬上面的數據模型,或者一般來說Web服務和XML模式不是用於這種特殊情況的最佳工具?

回答

4

要解釋您遇到的問題,有助於思考在調用服務時Axis需要執行的操作。

Axis只是一個java web應用程序...當它接收到服務請求時,它將查找您爲其定義的映射。如果它找到一個映射,它會嘗試創建您爲服務請求定義的必要類的實例。

如果您已將類定義爲抽象類或接口,那麼您將得到InstantiationExceptions,因爲無法創建這些類型。當Axis試圖創建wsdl時,它將無法確定要放置什麼類型,因此它將使用「anyType」。

要回答您的問題:您可以在代碼中使用上述模型,但是您將無法將這些類用於Axis。我們通常都在我們的項目做的是:

  1. 定義我們所需要的類,我們會在一個典型的面向對象的應用程序
  2. 定義一個用於Web服務「傳輸只」類。這些類由簡單的類型組成,可以很容易地創建。它們僅用於交換Web服務消息。我們在Axis中使用這些類。
  3. 找到這兩種類別輕鬆共享/交換信息的方法。您可以擁有兩者共享的接口(但Axis不知道),甚至可以使用BeanUtils.copyProperites使兩個不同的對象保持同步。

希望能回答你的問題。