У меня есть wsdl со встроенным xsd.
wsdl
xsd
<wsdl:definitions name="AcmeService" targetNamespace="http://www.acme.com/services/Acme/WcfService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.acme.com/services/Acme/WcfService" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <xsd:schema targetNamespace="http://www.acme.com/services/Acme/WcfService/Imports"> <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd0" namespace="http://www.acme.com/services/Acme/WcfService" /> <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> </xsd:schema> </wsdl:types> <!-- Some more WSDL Content --> </wsdl:definitions>
Мой 'xsd' содержит следующие определения:
<xs:schema elementFormDefault="qualified" targetNamespace="http://www.acme.com/services/Acme/WcfService"> <xs:element name="SetApplication"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="application" nillable="true" type="tns:Application"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="Application"> <xs:sequence> <xs:element minOccurs="0" name="SomeElement" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="AnotherElement" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="AcmeDetails" nillable="true" type="tns:Acme"/> </xs:sequence> </xs:complexType> <xs:element name="Application" nillable="true" type="tns:Application"/> <xs:complexType name="Acme"> <xs:sequence> <xs:element minOccurs="0" name="PropertyOne" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="PropertyTwo" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="Acme" nillable="true" type="tns:Acme"/> <xs:element name="GetAcmeDetails"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="acme" nillable="true" type="tns:Acme"/> <!-- "acme" name is lowercase on purpose --> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetAcmeDetailsResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="GetAcmeDetailsResult" nillable="true" type="tns:Acme"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Моя проблема связана с тем, чтопри создании заглушек служб с помощью wsimport у меня остается следующее определение для Acme:
Acme
@XmlType(name = "Acme", namespace = "http://www.acme.com/services/Acme/WcfService", propOrder = {
Проблема заключается в том, что мне нужны и 1013 *, и AcmeDetails для разрешения одного и того же базового уровня.Acme объект.
AcmeDetails
Глядя на пару других похожих вопросов ( здесь , здесь и здесь ) я пыталсясоздать привязку, используя следующий XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" wsdlLocation="Acme_Service.wsdl"> <enableWrapperStyle>true</enableWrapperStyle> <enableAsyncMapping>false</enableAsyncMapping> <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Application']/xs:sequence/xs:element[@name='AcmeDetails']"> <jaxb:class name="AcmeDetails"/> </jaxws:bindings> </jaxws:bindings>
Приведенная выше привязка генерирует класс «AcmeDetails», но аннотация XMLType остается «Acme».
Любая помощь в создании привязок к обоим Acme и AcmeDetails в приведенном выше экстракте с благодарностью.
Внешние файлы XML-схемы, импортированные файлом WSDL, можно настроить с помощью файла объявления внешней привязки JAXB:
<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="1.0"> <jxb:bindings schemaLocation="your-imported-xsd-location" node="/xsd:schema"> <jxb:schemaBindings> <jxb:package name="fromjava.client"/> </jxb:schemaBindings> </jxb:bindings> ... </jxb:bindings>
Файл внешней декларации привязки JAXB можно передать в wsimport с помощью ключа -b.Подробности смотрите в документации по инструментам JAX-WS.
Вышеприведенная выдержка взята из этой ссылки ;хотя, скорее всего, применимо к вашей версии, вы можете дважды проверить то же самое;