wsImport: jaxb nameXmlTransform не работает: класс / интерфейс с тем же именем уже используется - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно сгенерировать классы Java из файла WSDL.

Я использую плагин jaxws-maven-plugin, настроенный следующим образом:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.5</version>
    <executions>
        <execution>
            <id>wsimportPhase</id>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <keep>true</keep>
                <verbose>true</verbose>
                <packageName>my.package.name</packageName>
                <wsdlFiles>
                    <wsdlFile>${basedir}/wsdl/myWSDL.wsdl</wsdlFile>
                </wsdlFiles>
                <wsdlLocation>wsdl/myWSDL.wsdl</wsdlLocation>
                <bindingDirectory>wsdl</bindingDirectory>
                <bindingFiles>
                    <bindingFile>myBinding.xml</bindingFile>
                </bindingFiles>
                <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
            </configuration>
        </execution>
    </executions>
</plugin>

И я настроил (с некоторымитрудности) привязки JAXB следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<jaxws:bindings version="2.1"
    schemaLocation="myWSDL.wsdl" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    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">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:import">
        <jaxb:bindings schemaLocation="importedXSD_1.xsd">
            <jaxb:bindings node="xs:complexType[@name='DuplicatedType']">
                <jaxb:schemaBindings>
                    <jaxb:nameXmlTransform>
                        <jaxb:typeName suffix="Suffix1"/>
                        <jaxb:elementName suffix="Suffix1"/>
                    </jaxb:nameXmlTransform>
                </jaxb:schemaBindings>
            </jaxb:bindings>
        </jaxb:bindings>
        <jaxb:bindings schemaLocation="importedXSD_2.xsd">
            <jaxb:bindings node="xs:complexType[@name='DuplicatedType']">
                <jaxb:schemaBindings>
                    <jaxb:nameXmlTransform>
                        <jaxb:typeName suffix="Suffix2"/>
                        <jaxb:elementName suffix="Suffix2"/>
                    </jaxb:nameXmlTransform>
                </jaxb:schemaBindings>
            </jaxb:bindings>
        </jaxb:bindings>
    </jaxws:bindings>
</jaxws:bindings>

Но когда я запускаю mvn install, я получаю следующую ошибку:

[INFO] jaxws:wsimport args: [-keep, -s, '/workspace/myproject/src/main/java', -d, '/workspace/myproject/target/classes', -verbose, -encoding, UTF-8, -Xnocompile, -p, my.package.name, -wsdllocation, wsdl/myWSDL.wsdl, -b, 'file:/workspace/myproject/src/main/resources/wsdl/mybinding.xml', "file:/workspace/myproject/src/main/resources/wsdl/myWSDL.wsdl"]
parsing WSDL...

[ERROR] A class/interface with the same name "my.package.name.DuplicatedType" is already in use. Use a class customization to resolve this conflict.

XPath правильно находит нужный complexType вxsd, так что я не понимаю, как это исправить.

1 Ответ

0 голосов
/ 30 октября 2019

Я нашел решение, объединяющее решения, описанные в этих двух вопросах:

wsimport - как генерировать классы конечных точек службы и классы JAXB в отдельных проектах / папках

JAXB-схема для Java. Различное имя и имя класса XmlRootElement

Я сделал следующие шаги:

  1. Я создал два файла привязки, одиндля jaxws-binding и другого для jaxb-binding.

    Это два файла:

jaxws-binding.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings version="2.1"
    schemaLocation="myWSDL.wsdl" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    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">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:import">
    </jaxws:bindings>
</jaxws:bindings>

jaxb-binding.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="1.0"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">   
    <jaxb:bindings schemaLocation="importedXSD_1.xsd" node="xsd:complexType[@name='DuplicatedType']">
        <jaxb:class name="DuplicatedTypeSuffix1"/>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="importedXSD_2.xsd" node="xsd:complexType[@name='DuplicatedType']">
        <jaxb:class name="DuplicatedTypeSuffix2"/>
    </jaxb:bindings>
</jaxb:bindings>
Я объявил два файла привязки в теге <bindingFiles> модуля jaxb-maven-plugin в файле pom.xml
...