почему схема xsd не может проверить длину строки с ограничением maxLength

Я разрабатываю SOAP веб-службы, и я определил свою схему xsd и файл wsdl, в котором я хочу проверить элемент comment (чей тип — строка), установив его максимальную длину. Но когда я проверяю запрос с помощью SoapUI, мне кажется, что схема xsd не проверяет максимальную длину строки.

Ниже приведен синтаксис моей схемы xsd:

<xsd:element name="comment" minOccurs="0">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="20"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

Кто-нибудь знает, почему? Заранее спасибо.


person stevey    schedule 16.09.2014    source источник
comment
Можете ли вы добавить больше информации? .. Используете ли вы какой-либо фреймворк для публикации своих ws? .. и т. д. .. добавьте больше деталей, чтобы помочь вам лучше.   -  person Xstian    schedule 16.09.2014
comment
@Xstian Я использую структуру cxf для публикации своих файлов ws. В моем файле cxf-servlet.xml включена проверка схемы.   -  person stevey    schedule 17.09.2014


Ответы (1)


SOAPUI правильно проверяет запрос SOAP на соответствие его xsd, однако вам необходимо выполнить целевую проверку, выбрав параметр проверки, щелкнув правой кнопкой мыши окно запроса SOAP (как показано на последнем рисунке), если вы отправляете запрос напрямую без его проверки, SOAPUI просто отправляет запрос, даже если он имеет неправильную форму xml, потому что SOAPUI — это инструмент тестирования, и вы, возможно, захотите отправить неверный запрос специально для проверки своего WS.

Я делаю образец с maxLength <restriction> в <xs:string> и получаю следующий результат (я использую SOAPUI 4.5.2):

введите здесь описание изображения

Для этого я использую следующие wsdl:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:impl="sample:wsdl"
    xmlns:dss="sample:schema"
    targetNamespace="sample:wsdl" name="dss">
    <!-- Schema Type Definitions -->
    <types>
        <xs:schema xmlns:dss="sample:schema" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="sample:schema" elementFormDefault="qualified" 
        attributeFormDefault="unqualified">
            <!-- COMMON PROTOCOL STRUCTURES -->
            <xs:element name="comment" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:maxLength value="20"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:schema>        
    </types>
    <!--Messages-->
    <message name="CommentRequest">
        <part name="CommentRequest" element="dss:comment"/>
    </message>
    <!-- PortTypes -->
    <portType name="SOAPport">
        <operation name="doComment">
            <input message="impl:CommentRequest"/>
            <output message="xs:anyType"/>
        </operation>    
    </portType> 
    <!-- Bindings -->
    <binding name="SOAPBinding" type="impl:SOAPport">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="doComment">
            <soap:operation/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <!--Service definition-->
    <service name="doCommentService">
        <port name="dssPortSoap" binding="impl:SOAPBinding">
            <soap:address location="http://testing.stackoverflow.answer"/>
        </port>
    </service>
</definitions>

Как вы можете видеть в wsdl CommentRequest в виде следующей схемы с maxLength <restriction>:

<xs:schema xmlns:dss="sample:schema" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="sample:schema" elementFormDefault="qualified" 
            attributeFormDefault="unqualified">
    <!-- COMMON PROTOCOL STRUCTURES -->
    <xs:element name="comment" minOccurs="0">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="20"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

Затем я создаю новый проект SOAPUI из wsdl и добавляю запрос SOAP, если я помещаю строку с более чем 20 символами в <comment/> и нажимаю правой кнопкой мыши на окно запроса SOAP и выбираю «Проверить», это дает вам сообщение об ошибке, показанное на первом рисунке. :

введите здесь описание изображения

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

person albciff    schedule 16.09.2014
comment
Большое спасибо за вашу помощь. На самом деле я использую структуру cxf для публикации своего веб-сервиса. Когда я создаю новый проект в soapui, я заполнил localhost:8080/test/services/webservice?wsdl как начальный wsdl. Затем я проверяю запрос с помощью опции проверки soapui (щелчок правой кнопкой мыши -> проверка), но это не работает. Однако, если я просматриваю файл wsdl для первоначального wsdl, когда я проверяю запрос, он сработал. Есть идеи? Спасибо. - person stevey; 17.09.2014
comment
Вероятно, ваш локальный файл wsdl и файл wsdl в localhost:8080/test/services/webservice?wsdl отличаются. Можете ли вы поделиться обоими wsdl, чтобы проверить? - person albciff; 17.09.2014
comment
Я обнаружил, что в моем файле wsdl есть некоторые проблемы. Теперь это работает, спасибо за вашу помощь. - person stevey; 18.09.2014
comment
Добро пожаловать :). Итак, наконец, есть какие-то различия между вашими wsdl? - person albciff; 18.09.2014