2011-02-15 90 views
1

我正在使用Zend Framework構建一個Web服務。我正在使用Zend_Soap_AutoDiscover類來生成我的WSDL。我在這個Web服務的形式例如使用各種複雜類型:SOAP - nillable =「true」

StockItemEntity類

class StockItemEntity { 
    /** @var string */ 
    public $sStockCode; 
    /** @var string */ 
    public $sQty; 

    public function __construct($sStockCode, $sQty){ 
     $this->sStockCode = $sStockCode; 
     $this->sQty = $sQty; 
    } 
} 

WSDL定義

<xsd:complexType name="StockItemEntity"> 
    <xsd:all> 
    <xsd:element name="sStockCode" type="xsd:string" nillable="true"/> 
    <xsd:element name="sQty" type="xsd:string" nillable="true"/> 
    </xsd:all> 
</xsd:complexType> 

從我從閱讀在Web上的nillable理解=「true」,因爲任何對象的屬性都可以設置爲null。因此,即使StockItemEntity對象的所有屬性設置爲null,nillable =「true」也需要維護有效的XML文檔。

我擔心的是這兩個屬性必須始終傳遞給Web方法。是否有可能刪除「nillable = true」以強制屬性不爲null?否則有什麼辦法來強制這些屬性中的非空值。我希望避免在web服務端驗證它們。

感謝

親切的問候

加布裏埃爾

回答

3

在Zend框架1.10.7和1.11.0之間的一些階段,他們引入了一段代碼,使用反射來檢查是否有對的一個屬性所定義的默認值類,如果沒有,它決定該類是「可修改的」,並將nillable =「True」添加到WSDL中的屬性定義中。這顯然是爲了改善與某些片狀版本.Net的互操作性。

要停止Zend Framework添加nillable標誌,只需在聲明它們時初始化這些屬性,例如。

/** @var string */ 
public $sStockCode = ''; 
/** @var string */ 
public $sQty = ''; 

希望有所幫助。

0

nillable='true'表示該元素可以在XML文檔實例空。 如果XML文檔中的元素爲null,那麼這是由

<sStockCode xsi:nil='true' /> 

指示(元素本身必須是空的)

這聽起來像你需要到xsd改爲nillable='false'。此外,字符串可以爲空 - 如果您想防止在xsd中使用minLength屬性的空字符串。如果沒有提供,您也可以使用default爲字符串指定默認值。

W3schools has good reference material for XSD's here

HTH

+0

Oki所以說我設法設置nillable ='false屬性。如果soap_client嘗試傳遞空值,會發生什麼。他們會得到一個soap_fault? – 2011-02-15 09:24:09