SOAP - nillable =“true”

时间:2011-02-15 08:21:08

标签: web-services zend-framework soap wsdl zend-soap

我正在使用Zend Framework构建Web服务。我正在使用Zend_Soap_AutoDiscover类来生成我的WSDL。我在此Web服务表单示例中使用各种复杂类型:

StockItemEntity Class

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>

根据我从网上阅读的理解,nillable =“true”就在那里,因为任何对象的属性都可以设置为null。因此,即使StockItemEntity对象的所有属性都设置为null,nillable =“true”也需要维护有效的XML文档。

我担心的是,必须始终将这两个属性传递给Web方法。是否有可能删除“nillable = true”以强制属性不为null?或者有没有办法在这些属性中强制非空值。我希望避免在网络服务方面验证它们。

由于

亲切的问候

加布里埃尔

2 个答案:

答案 0 :(得分:5)

在Zend Framework 1.10.7和1.11.0之间的某个阶段,他们引入了一段代码,该代码使用反射来检查是否为类的属性定义了默认值,如果没有,则决定该类是“nillable”并将nillable =“True”添加到WSDL中的属性定义。这显然是为了改善与.Net的一些片状版本的互操作性。

要阻止Zend Framework添加nillable标志,只需在声明它们时初始化这些属性,例如

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

希望有所帮助。

答案 1 :(得分:0)

nillable='true'表示元素在xml文档实例中可以为null。 如果xml文档中的元素为null,则由

指示
<sStockCode xsi:nil='true' />

(元素本身必须为空)

听起来您需要将xsd更改为nillable='false'。此外,string可以为空 - 如果要防止xsd中具有minLength属性的空字符串。如果未提供字符串,您还可以使用默认值指定字符串的默认值。

W3schools has good reference material for XSD's here

HTH