1

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

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>

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

我担心的是这两个属性必须始终传递给 web 方法。是否可以删除“nillable = true”以强制属性不为空?否则有什么方法可以强制这些属性中的非空值。我希望避免在 web 服务端验证它们。

谢谢

亲切的问候

加布里埃尔

4

2 回答 2

5

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

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

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

希望有帮助。

于 2012-01-16T09:00:42.150 回答
0

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

<sStockCode xsi:nil='true' />

(元素本身必须为空)

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

W3schools 在这里有很好的 XSD 参考资料

高温高压

于 2011-02-15T09:09:54.963 回答