Jaxb schemaBinding не работает с xs: import - PullRequest
0 голосов
/ 25 января 2019

Jax-WS и Jaxb работают нормально и выполняют привязку пользовательской схемы, когда WSDL хранится в одном файле.

Но когда основной wsdl включает в себя подчиненный wsdl с тегом <xs:import>, привязка JAXB не работает.Цель состоит в том, чтобы изменить имя пакета с org.wrong на org.right

См. WSDL и файл сопоставления ниже.«Настоящие» wsdls гораздо более громоздки, я просто попытался максимально упростить структуру

Master.wsdl

<wsdl:definitions name="CurrentTimeService"
    targetNamespace="http://org" xmlns:tns="http://org"
    xmlns:wrong="http://wrong.org"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:import namespace="http://wrong.org" schemaLocation="slave.wsdl"/>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="forestMsg">
        <wsdl:part element="wrong:Forest" name="Forest" />
    </wsdl:message>
</wsdl:definitions>

slave.wsdl

<xs:schema targetNamespace="http://wrong.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" xmlns="http://wrong.org"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xs:element name="Forest">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="99" minOccurs="0" name="Apple"> 
                <xs:complexType>
                <xs:sequence>
                <xs:element name="Size" type="xsd:string" />
                </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

Файл привязки master.xjb:

<jaxws:bindings
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
     xmlns="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:import[@namespace='http://wrong.org']">
        <jaxb:schemaBindings>
            <jaxb:package name="org.right" />
        </jaxb:schemaBindings>

    </jaxws:bindings>   
</jaxws:bindings> 

Файл привязки slave.xjb:

<jaxws:bindings
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    wsdlLocation="../wsdl/slave.wsdl">

    <jaxws:bindings node="xs:schema[@targetNamespace='http://wrong.org']"> 
        <jaxb:schemaBindings map="true">
            <jaxb:package name="org.right" />
        </jaxb:schemaBindings>
    </jaxws:bindings>   

</jaxws:bindings>

Связывание игнорируется.Но если я поместил содержимое slave.wsdl вместо тега <xs:import> в master и слегка изменил файл привязки (удалите slave.xjb и обновите xpath в master.xjb - все работает нормально. Я попытался поменять jaxb на jaxws и наоборот, поиграйте с xpath, оставьте только один из обязательных файлов - ничто не может помочь.

Xpath верны, если я изменю XPATH на неправильные, CXF выдаст сообщение об ошибке

Любая идея, что можно сделать?

...