Позвольте мне первым сказать, что я понятия не имею, ПОЧЕМУ это так, но я предполагаю, что точное содержание пространства имен может не иметь значения, если они все одинаковые. Мы даже не используем никаких специальных функций 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 или
пакет объекта службы, который его использует?