Ошибка добавления атрибута и ограничения длины для сложного типа

#java #spring #web-services #xsd #xsd-validation

#java #spring #веб-сервисы #xsd #xsd-проверка

Вопрос:

У нас есть запрос XSD, который мы используем в нашей системе, и есть веб-служба Spring, которая использовала этот запрос XSD.

Все компилируется и развертывается правильно. Я могу ввести URL-адрес WSDL в IE и просмотреть его. Я могу перейти к запросу XSD в IE. Так что, похоже, с запросом XSD все в порядке. Но когда я пытаюсь вызвать веб-службу через SOAP UI: создайте новый проект и добавьте WSDL и нажмите OK, я получаю следующую ошибку

 ERROR:error: src-ct.2: To Extend the specified base type ‘Name@*MyNAMESPACE*‘ it must be a simple type or be a complex type with simple content.
  

В моем XSD у меня есть поле имени

 <xs:simpleType name="Name">
    <xs:restriction base="xs:string">
        <xs:minLength value="1"/>
        <xs:maxLength value="15"/>
    </xs:restriction>
</xs:simpleType>
  

И затем я использую это в нескольких местах, где я расширяю его, добавляя атрибут

 <xs:complexType name="MyCustomeName">
      <xs:simpleContent>
             <xs:extension base="mc:Name">
                    <xs:attribute name="MyTypeOfName" fixed="MCN"/>
             </xs:extension>
      </xs:simpleContent>
</xs:complexType>
  

Из того, что я вижу, единственный способ обеспечить ограничение длины и добавить атрибут похож на то, как я его определил.

Понятия не имею, что определено неправильно. Есть идеи?


Как и было запрошено, вот мой WSDL сервиса

 <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="the-location"
                  xmlns="http://schemas.mycomp.com/myowndir/"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  targetNamespace="http://schemas.mycomp.com/myowndir/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <xs:schema>
            <xs:import namespace="http://schemas.mycomp.com/myowndir/"
                       schemaLocation="../xsd/MyRequest-1.0.xsd"/>
            <xs:import namespace="http://schemas.mycomp.com/myowndir/"
                       schemaLocation="../xsd/MyResponse-1.0.xsd"/>

            <xs:element name="TheServiceResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="MessageId" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>

    <wsdl:message name="TheServiceRequest">
        <wsdl:part name="TheServiceRequestPart" element="TheServiceRequest"/>
    </wsdl:message>
    <wsdl:message name="TheServicePlanResponse">
        <wsdl:part name="TheServiceResponsePart" element="TheServiceResponse"/>
    </wsdl:message>

    <wsdl:portType name="TheServicePortType">
        <wsdl:operation name="MyOperation">
            <wsdl:input message="TheServiceRequest" name="TheServiceRequestInput"/>

            <wsdl:output message="TheServicePlanResponse" name="TheServicePortTypeResponseOutput"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="TheServiceBinding" type="TheServicePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="MyOperation">
            <soap:operation soapAction="http://schemas.mycomp.com/myowndir/MyOperation"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="TheService">
        <wsdl:port binding="TheServiceBinding" name="TheServiceIntegrationPort">
            <soap:address location="/the-location/the-service"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>
  

Комментарии:

1. Привет, я думаю, что ваши определения типов верны, можете ли вы поделиться своим wsdl, чтобы сделать несколько попыток? возможно, ошибка в другом месте.

2. Спасибо albciff. Я добавил WSDL. Пришлось изменить некоторые значения на фиктивные значения.

3. Привет @Chrispie, можете ли вы поделиться также MyRequest-1.0.xsd и MyResponse-1.0.xsd. Кроме того, в вашем wsdl <xs:имя элемента=»TheServiceRequest»> отсутствует.

4. Фактический веб-сервис был отправлен сторонней команде, они в основном просто используют наши запросы / ответы XSD. Они используют JDK6 Spring 3.1. Похоже, что когда мы берем WSDL с сервера, происходит сбой SOAP UI, но если мы загружаем WSDL из локальной файловой системы, SOAP UI загружает его правильно. Затем мы просто меняем конечную точку, чтобы указать на сервер. Тогда все в порядке. Итак, на данный момент это то, что мы будем использовать. Спасибо за вашу помощь