WSDL, созданный вручную из XSD, завершается ошибкой в ​​CXF: пространство имен в элементе «QueryResponse» не является допустимой версией SOAP - PullRequest
0 голосов
/ 09 августа 2011

У меня есть веб-служба, которая следует некоторой семантике службы SOAP, но они не предоставляют WSDL для указанной службы. Вместо этого они предоставляют XSD, с помощью которого я реверс-инжиниринг WSDL. Казалось, что дела идут хорошо, даже до такой степени, что она может

  1. создать WSDL
  2. Импорт XSD как части WSDL с использованием тега xsd:import
  3. Создание оболочек Java с CXF
  4. Позвоните в службу.

Теперь то, что я получаю, когда звоню в службу, является исключением:

INFO: Creating Service {http://service.something.net/xml}QueryService from WSDL: file:/C:/mydocs/Work/project/my-service.wsdl
Aug 09, 2011 1:22:34 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Interceptor for {http://service.something.net/xml}QueryService#{http://servicesomething..../xml}QueryRequest has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: "http://service.something.net/xml", the namespace on the "QueryResponse" element, is not a valid SOAP version.

WSDL можно найти в этой сущности , а XSD - это то, что я получил от продавца.

Что означает ошибка? Что я мог сделать неправильно при генерации файла .wsdl?

Редактировать 1

Я вручную проверил сервис от поставщика услуг, и мне кажется, что все в порядке:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <QueryResponse xmlns="http://service.something.net/xml">
        ....
        </QueryResponse>
    </Body>
</Envelope>

Если только я что-то упустил, не должно быть никаких причин, по которым CXF даже хочет, чтобы QueryResponse был элементом SOAP, поскольку его пространство имен не SOAP, а http://service.something.net/xml.

1 Ответ

1 голос
/ 10 августа 2011

Куда вы импортируете свой XSD:

<wsdl:types>
    <xsd:schema targetNamespace="http://service.something.net/xml">
        <xsd:include schemaLocation="My-XSD.xsd" />
    </xsd:schema>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:import namespace="http://service.something.net/xml"
            schemaLocation="My-XSD.xsd">
        </xsd:import>
    </xsd:schema>
</wsdl:types>

попробуйте вместо этого:

<wsdl:types>
    <xs:schema targetNamespace="http://service.something.net/xml" 
               elementFormDefault="qualified">
        <xs:import schemaLocation="My-XSD.xsd"/>
    </xs:schema>
</wsdl:types>

По сути, вам не нужно включать, только импорт. Также вы хотите указать полностью квалифицированную форму элемента.

Надеюсь, это сработает.

...