SOAP - nillable = "true" - PullRequest
       47

SOAP - nillable = "true"

1 голос
/ 15 февраля 2011

Я строю веб-сервис с использованием Zend Framework.Я использую класс Zend_Soap_AutoDiscover для генерации моего WSDL.В этом примере формы веб-службы я использую различные сложные типы:

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.Таким образом, nillable = "true" необходимо для поддержки действительного документа XML, даже если все свойства объекта StockItemEntity имеют значение null.

Меня беспокоит то, что эти два свойства всегда должны передаваться веб-методу.Можно ли удалить «nillable = true», чтобы заставить свойства не быть нулевыми?Или же есть какой-либо способ заставить ненулевые значения в этих свойствах.Я надеялся избежать проверки их на стороне веб-службы.

Спасибо

С уважением

Габриэль

Ответы [ 2 ]

5 голосов
/ 16 января 2012

На каком-то этапе между Zend Framework 1.10.7 и 1.11.0 они представили фрагмент кода, который использует отражение, чтобы проверить, определено ли значение по умолчанию для атрибута класса, и, если нет, он решает, что класс имеет значение «nillable» и добавляет nillable = «True» к определению атрибута в WSDL. Это, очевидно, предназначено для улучшения совместимости с какой-то нестабильной версией .Net.

Чтобы Zend Framework не добавлял флаг nillable, просто инициализируйте эти свойства, когда они объявлены, например.

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

Надеюсь, это поможет.

0 голосов
/ 15 февраля 2011

nillable='true' указывает, что элемент МОЖЕТ быть нулевым в экземпляре документа xml.Если элемент в XML-документе равен NULL, то это обозначается

<sStockCode xsi:nil='true' />

(сам элемент должен быть пустым)

Похоже, вам нужно изменить xsd на nillable='false'.Кроме того, строка может быть пустой - если вы хотите предотвратить пустые строки с атрибутом minLength в вашем xsd.Вы также можете использовать default, чтобы указать значение по умолчанию для строки, если оно не предоставлено.

W3schools имеет хороший справочный материал для XSD здесь

HTH

...