Привязки JAXB во встроенном 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:

@XmlType(name = "Acme", namespace = "http://www.acme.com/services/Acme/WcfService", propOrder = {

Проблема в том, что мне нужно, чтобы и Acme, и AcmeDetails разрешались в один и тот же базовый объект Acme.

Глядя на пару других похожих вопросов (здесь, здесь и здесь) Я попытался создать привязку, используя следующий 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 в приведенном выше отрывке.


person radimpe    schedule 02.04.2012    source источник


Ответы (1)


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

Приведенный выше отрывок взят из этой ссылки; хотя, скорее всего, это применимо к вашей версии, вы можете дважды проверить то же самое;

person Petru Gardea    schedule 02.04.2012
comment
Спасибо за информацию. Я читал эту статью ранее (думаю, вы могли выделить это в отдельном посте). Немного, что я, возможно, упустил, так это то, что я, вероятно, смешиваю свои wsdlLocation, node и schemaLocation в моем файле привязок. Я почти уверен, что мой XPath верен (обе задокументированные попытки должны были сработать), но где-то в смеси вещей я ошибаюсь. - person radimpe; 02.04.2012
comment
На самом деле, это две отдельные привязки. Если присмотреться, {java.sun.com/xml/ns/jaxb}bindings, который имеет атрибут schemaLocation для внешнего файла XSD (см. XSD здесь) отличается от {java.sun.com/xml/ns/jaxws}bindings с атрибутом wsdlLocation (см. схему здесь). Опять же, одна для пользовательской привязки для XSD, другая — для пользовательской привязки для WSDL. - person Petru Gardea; 03.04.2012
comment
Я разобрался со схемой/wsdllocation в моем файле bindings.xml. У меня все еще есть исходная проблема, когда, в зависимости от пути, по которому вы получаете доступ к Acme, он либо должен сгенерировать сопоставление с AcmeDetails, либо остаться просто Acme. - person radimpe; 03.04.2012