【问题标题】:SOAP - nillable="true"SOAP - nillable="true"
【发布时间】:2011-02-15 08:21:08
【问题描述】:

我正在使用 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 服务端验证它们。

谢谢

亲切的问候

加布里埃尔

【问题讨论】:

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


    【解决方案1】:

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

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

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • Oki 所以说我设法设置了 nillable='false 属性。如果他们尝试传递空值,soap_client 会发生什么。他们会得到soap_fault吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多