У меня есть wsdl
со встроенным xsd
.JAXB Привязки во встроенном 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
:
@XmlType(name = "Acme", namespace = "http://www.acme.com/services/Acme/WcfService", propOrder = {
проблема в том, что мне нужно как Acme
и AcmeDetails
, чтобы решить, к тому же, лежащий в основе Acme
объект.
Глядя на несколько других, подобных, вопросы (here, here и here) Я попытался создать привязку, используя следующий 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
в приведенном выше изложении очень ценится.
Спасибо за информацию. Я читал эту статью ранее (думаю, вы могли бы выделить это в отдельном сообщении). Бит, который мне, возможно, отсутствует, заключается в том, что я, вероятно, смешиваю свои 'wsdlLocation',' node' и 'schemaLocation' в моем файле привязок. Я почти уверен, что мой «XPath» является правильным, хотя (оба документальных попытки должны были сработать), но где-то в смешении вещей я ошибаюсь. – radimpe
На самом деле это два отдельных привязки. Если вы посмотрите подробнее, {http://java.sun.com/xml/ns/jaxb}bindings, у которого есть атрибут schemaLocation для внешнего файла XSD (см. XSD [здесь] (http: // java. sun.com/xml/ns/jaxb/bindingschema_2_0.xsd)) отличается от {http://java.sun.com/xml/ns/jaxws}bindings, у которого есть атрибут wsdlLocation (см. схему [здесь] (http://java.sun.com/xml/ns/jaxws/wsdl_customizationschema_2_0.xsd)). Опять же, если пользовательский привязку для XSD, другой - это настраиваемые привязки для WSDL. –
Я отсортировал часть схемы/wsdllocation моего bindings.xml. У меня все еще есть оригинальная проблема, где, в зависимости от пути, через который вы получаете доступ к «Acme», ему нужно либо создать сопоставление с «AcmeDetails», либо просто «Acme». – radimpe