2012-04-02 9 views
4

У меня есть 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 в приведенном выше изложении очень ценится.

ответ

4

Внешних файлы схема 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.

Вышеприведенная выдержка относится к this link; хотя, скорее всего, применимо к вашей версии, вы можете дважды проверить то же самое;

+0

Спасибо за информацию. Я читал эту статью ранее (думаю, вы могли бы выделить это в отдельном сообщении). Бит, который мне, возможно, отсутствует, заключается в том, что я, вероятно, смешиваю свои 'wsdlLocation',' node' и 'schemaLocation' в моем файле привязок. Я почти уверен, что мой «XPath» является правильным, хотя (оба документальных попытки должны были сработать), но где-то в смешении вещей я ошибаюсь. – radimpe

+0

На самом деле это два отдельных привязки. Если вы посмотрите подробнее, {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. –

+0

Я отсортировал часть схемы/wsdllocation моего bindings.xml. У меня все еще есть оригинальная проблема, где, в зависимости от пути, через который вы получаете доступ к «Acme», ему нужно либо создать сопоставление с «AcmeDetails», либо просто «Acme». – radimpe

Смежные вопросы