#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 загружает его правильно. Затем мы просто меняем конечную точку, чтобы указать на сервер. Тогда все в порядке. Итак, на данный момент это то, что мы будем использовать. Спасибо за вашу помощь