WSDL, генерируемые сервисами Axis2, не могут быть прочитаны SoapUI или WSDL2Java - PullRequest
3 голосов
/ 17 марта 2010

Я конвертирую некоторые сервисы из Apache SOAP в Axis2, поэтому классы сервисов Java уже существуют. Я создал новый проект в Eclipse, импортировал исходный код, убедился, что грани проекта Axis2 установлены и свойства эмиттера Axis2 верны. Затем в Eclipse я выбрал класс сервиса и выбрал «Создать веб-сервис», выбрав среду выполнения Axis2. Служба запущена и работает на моем ПК, и когда я добавляю «? Wsdl» к пути службы, я действительно получаю WSDL, который я сохраняю локально. Попытка импортировать это в SoapUI для создания клиента выдает ошибку:

ERROR:org.apache.xmlbeans.XmlException: C:\projects\soapUI\Axis2\DALService.wsdl:0: error: src-resolve: type 'SOAPException@http://www.w3.org/2001/XMLSchema' not found.

Тип, на который он ссылается (SOAPException), является удержанием от служб Apache SOAP, и в коде службы я изменил все ссылки на импорт в коде службы (не WSDL) с org.apache.soap.SOAPException (старый Apache Имя пакета SOAP) до javax.xml.soap.SOAPException (местоположение Axis2). Код компилируется и работает, как только я могу получить к нему доступ, но я не могу получить к нему доступ без генерации клиента. Любые мысли о том, почему изменение пространства имен объекта не позволит сгенерированным WSDL иметь правильные ссылки на пространство имен?

Ответы [ 2 ]

0 голосов
/ 18 марта 2010

Позвольте мне первым сказать, что я понятия не имею, ПОЧЕМУ это так, но я предполагаю, что точное содержание пространства имен может не иметь значения, если они все одинаковые. Мы даже не используем никаких специальных функций SOAPException, потому что он только слепо расширяет обычное исключение. В любом случае, я смог заставить SoapUI создавать клиентов из XML, выполнив три действия.

Сначала я добавил раздел для представления самого SOAPException, например:

    <xs:schema xmlns:test="http://service.PROJECT.DEPARTMENT.COMPANY.com" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://DEPARTMENT.COMPANY.com/xsd">
        <xs:import namespace="http://service.PROJECT.DEPARTMENT.COMPANY.com"/>
        <xs:complexType name="SOAPException">
            <xs:complexContent>
                <xs:extension base="ns:Exception">
                    <xs:sequence/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

Во-вторых, я добавил следующее пространство имен в блок wsdl: определения:

xmlns:im="http://DEPARTMENT.COMPANY.com/xsd"

В-третьих, я изменил пространство имен, на которое ссылается базовый тип SOAPException (от fron ns до im здесь), где оно ранее упоминалось:

    <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.ims.im.sa.homedepot.com/xsd">
        <xs:complexType name="SOAPLocatorException">
            <xs:complexContent>
                <xs:extension base="im:SOAPException">
                    <xs:sequence>
                        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
                        <xs:element minOccurs="0" name="messageCode" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:schema>

Файл XML по-прежнему не проверяется корректно в XMLSpy, но только по более эзотерической причине, которая не затрагивает меня напрямую (операции, которые имеют ошибки, определенные для привязок Soap11 и Soap12, не имеют ошибок определено для необработанных HTTP-привязок).

Несмотря на то, что это работает, я все еще немного озадачен следующим:

  • Если Axis2 знает об исключении SOAPException типа (и это сделал, потому что это упомянул это как базовый класс другие исключения), почему не так определить его в xs:schema блоке?
  • По тем же причинам, почему ссылаться на класс из неверного пространство имен при использовании его в качестве базы класс для другого типа?
  • Зачем мне устанавливать пространство имен для этот тип как DEPARTMENT.COMPANY.com а не пакет Axis2 или пакет объекта службы, который его использует?
0 голосов
/ 17 марта 2010

Просто используйте URL "xxx? Wsdl", который обнаружил WSDL непосредственно в пользовательском интерфейсе SOAP, похоже, что некоторые схемы XSD, указанные в WSDL, не обнаруживаются инструментом SOAP UI, как правило, эти инструменты ищут схемы в одной и той же схеме. Папка, также как у вас есть org.apache.soap.SOAPException для javax.xml.soap.SOAPException, это могло бы изменить пространство имен.

Просто попробуйте использовать полный URL и посмотрите результат.

...