3
votes

Classes manquantes dans @XmlSeeAlso annotation de la classe Java générée

Je génère des classes Java (puis je crée un jar basé sur elles) à partir de fichiers wsdl / xsd, en utilisant le cxf-codegen-plugin de Maven. J'ai choisi ce plugin par rapport à d'autres options car il me permet de référencer "dynamiquement" tous les fichiers wsdl et xsd dans un dossier au lieu de les écrire "statiquement" un par un dans les balises . La classe Java FurtherExtensionOfBaseObj (définie dans le fichier internet.xsd ) est implémentée à la fois par MyBarRequest (depuis bar.wsdl ) et MyZedRequest (de zed.wsdl ) mais dans son annotation @XmlSeeAlso uniquement MyBarRequest.class est référencé.

C'est comme si le plugin ne considérait que ce qu'il trouve dans le premier wsdl traité (par ordre alphabétique) et rien d'autre. Comment puis-je obtenir le plugin (ou tout autre plugin, même si j'aime celui-ci) pour référencer toutes les classes d'extension dans l'annotation @XmlSeeAlso ?

Vous pouvez extraire un projet de travail reproduisant exactement ce problème à https : //gitlab.com/t.meledina/xmlseealso-issue-poc

EDIT: le problème est maintenant résolu, le référentiel est maintenant un exemple fonctionnel de Solution de Tomas ci-dessous.

Alternativement, la liste de fichiers suivante peut être utilisée afin de reproduire le problème, le common.xsd ne devrait pas être pertinent mais il est nécessaire pour compiler .

fichier common.xsd

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mytest.mobile</groupId>
    <artifactId>mytest-jax-ws</artifactId>
    <version>20190707-1950</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.1.17</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <wsdlRoot>src/main/resources/wsdl</wsdlRoot>
                            <includes>
                                <include>*.wsdl</include>
                            </includes>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <id>auto-clean</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.2.7</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>

fichier internet.xsd

XXX

fichier bar.wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="zedService" targetNamespace="http://www.somehost.com/internet/zed/" xmlns:beans="http://www.somehost.com/internet/zed/beans/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www.somehost.com/internet/zed/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xsd:schema jaxb:version="2.0" targetNamespace="http://www.somehost.com/internet/zed/beans/" xmlns:common="http://www.somehost.com/common/beans" xmlns:internet="http://www.somehost.com/internet/beans" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <xsd:import namespace="http://www.somehost.com/common/beans" schemaLocation="common.xsd"/>
            <xsd:import namespace="http://www.somehost.com/internet/beans" schemaLocation="internet.xsd"/>
            <xsd:annotation>
                <xsd:appinfo>
                    <jaxb:globalBindings>
                        <jaxb:javaType name="java.util.Calendar" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" xmlType="xsd:dateTime"/>
                    </jaxb:globalBindings>
                </xsd:appinfo>
            </xsd:annotation>
            <xsd:complexType name="myZedRequest">
                <xsd:complexContent>
                    <xsd:extension base="internet:FurtherExtensionOfBaseObj">
                        <xsd:sequence>
                            <xsd:element minOccurs="1" name="blaap" type="xsd:long"/>
                        </xsd:sequence>
                    </xsd:extension>
                </xsd:complexContent>
            </xsd:complexType>
            <xsd:element name="myZedRequestElement" type="beans:myZedRequest"/>
            <xsd:complexType name="myZedResponse">
                <xsd:complexContent>
                    <xsd:extension base="common:BaseResponse">
                        <xsd:sequence minOccurs="0"/>
                    </xsd:extension>
                </xsd:complexContent>
            </xsd:complexType>
            <xsd:element name="myZedResponseElement" type="beans:myZedResponse"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="myZedRequest">
        <wsdl:part element="beans:myZedRequestElement" name="parameters"/>
    </wsdl:message>
    <wsdl:message name="myZedResponse">
        <wsdl:part element="beans:myZedResponseElement" name="parameters"/>
    </wsdl:message>
    <wsdl:portType name="zedPortType">
        <wsdl:operation name="myZed">
            <wsdl:input message="tns:myZedRequest"/>
            <wsdl:output message="tns:myZedResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="zedBinding" type="tns:zedPortType">
        <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="myZed">
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="zedService">
        <wsdl:port binding="tns:zedBinding" name="zedPort">
            <soap12:address location="http://localhost:9080/internet/zedService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

fichier zed.wsdl p >

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="bar" targetNamespace="http://www.somehost.com/internet/bar/" xmlns:beans="http://www.somehost.com/internet/bar/beans/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www.somehost.com/internet/bar/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xsd:schema jaxb:version="2.0" targetNamespace="http://www.somehost.com/internet/bar/beans/" xmlns:common="http://www.somehost.com/common/beans" xmlns:internet="http://www.somehost.com/internet/beans" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
            <xsd:import namespace="http://www.somehost.com/common/beans" schemaLocation="common.xsd"/>
            <xsd:import namespace="http://www.somehost.com/internet/beans" schemaLocation="internet.xsd"/>
            <xsd:annotation>
                <xsd:appinfo>
                    <jaxb:globalBindings>
                        <jaxb:javaType name="java.util.Calendar" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" xmlType="xsd:dateTime"/>
                    </jaxb:globalBindings>
                </xsd:appinfo>
            </xsd:annotation>
            <xsd:complexType name="myBarRequest">
                <xsd:complexContent>
                    <xsd:extension base="internet:FurtherExtensionOfBaseObj">
                        <xsd:sequence>
                            <xsd:element minOccurs="0" name="barObjAttuale" type="common:BarObj"/>
                            <xsd:element name="barObjNuovo" type="common:BarObj"/>
                        </xsd:sequence>
                    </xsd:extension>
                </xsd:complexContent>
            </xsd:complexType>
            <xsd:element name="myBarRequestElement" type="beans:myBarRequest"/>
            <xsd:complexType name="myBarResponse">
                <xsd:complexContent>
                    <xsd:extension base="common:BaseResponse">
                        <xsd:sequence minOccurs="0">
                            <xsd:element name="barObj" type="common:BarObj"/>
                        </xsd:sequence>
                    </xsd:extension>
                </xsd:complexContent>
            </xsd:complexType>
            <xsd:element name="myBarResponseElement" type="beans:myBarResponse"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="myBarRequest">
        <wsdl:part element="beans:myBarRequestElement" name="parameters"/>
    </wsdl:message>
    <wsdl:message name="myBarResponse">
        <wsdl:part element="beans:myBarResponseElement" name="parameters"/>
    </wsdl:message>
    <wsdl:portType name="barPortType">
        <wsdl:operation name="myBar">
            <wsdl:input message="tns:myBarRequest"/>
            <wsdl:output message="tns:myBarResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="barBinding" type="tns:barPortType">
        <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="myBar">
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="barService">
        <wsdl:port binding="tns:barBinding" name="barPort">
            <soap12:address location="http://localhost:9080/internet/barService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Fichier pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.somehost.com/internet/beans" xmlns:tns="http://www.somehost.com/internet/beans" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import namespace="http://www.somehost.com/common/beans" schemaLocation="common.xsd"/>
    <xsd:complexType name="BaseObj">
        <xsd:sequence>
            <xsd:element name="zeep" type="xsd:int"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="ExtensionOfBaseObj">
        <xsd:complexContent>
            <xsd:extension base="tns:BaseObj">
                <xsd:sequence>
                    <xsd:element name="moreZeep" type="xsd:int"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="SomeOtherObj">
        <xsd:sequence>
            <xsd:element name="neep" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="YetSomeOtherObj">
        <xsd:sequence>
            <xsd:element name="geep" type="xsd:dateTime"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="FurtherExtensionOfBaseObj">
        <xsd:complexContent>
            <xsd:extension base="tns:ExtensionOfBaseObj">
                <xsd:sequence>
                    <xsd:element name="evenMoreZeep" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>

Merci d'avance pour toute aide .


0 commentaires

3 Réponses :


0
votes

Pour pouvoir utiliser l'option WSDL-root de cxf-codegen-plugin , vous devez également fournir le fichier de liaisons JAXB (cf. le ). Les liaisons XML peuvent également être générées, reportez-vous à cette réponse SO .


1 commentaires

Merci d'avoir répondu. Pouvez-vous s'il vous plaît clarifier ce que vous entendez par "Pour pouvoir utiliser l'option WSDL-root de cxf-codegen-plugin, vous devez également fournir le fichier de liaisons JAXB"? L'option fonctionne déjà un peu (c'est-à-dire qu'elle construit les fichiers .java et .class). Je ne peux pas non plus trouver un moyen de "générer" le fichier de liaisons (je suppose que vous vouliez dire via le plugin) à partir de la réponse que vous avez liée, cela ressemble plus à quelques conseils sur la façon de l'écrire. Peut-être pourriez-vous esquisser un fichier de liaisons complétant les exemples de fichiers que j'ai référencés ici?



0
votes

J'ai récemment rencontré un problème, je voulais ajouter l'annotation @XmlSeeAlso à la classe générée à partir du fichier WSDL, ci-dessous veuillez trouver un exemple de code. Cela peut vous aider:

pom.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
        xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:annox="http://annox.dev.java.net"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        jaxb:extensionBindingPrefixes="annox">

    <jaxws:bindings schemaLocation="ReferenceDataService.wsdl">
        <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
            <jaxb:bindings node="xs:complexType[@name='ReferenceDataRequestCType']">
                <annox:annotate target="class">
                    @javax.xml.bind.annotation.XmlSeeAlso({com.project.BindingClass.class})
                </annox:annotate>
            </jaxb:bindings>
        </jaxws:bindings>
    </jaxws:bindings>
</jaxws:bindings>

bindings.xjb [fichier de configuration externe]

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>3.0.9</version>
    <executions>
        <execution>
            <id>generate-sources-referencedata</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                <defaultOptions>
                    <frontEnd>jaxws21</frontEnd>
                    <faultSerialVersionUID>1</faultSerialVersionUID>
                    <noAddressBinding>true</noAddressBinding>
                </defaultOptions>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdlLocation>classpath:ReferenceDataService.wsdl</wsdlLocation>
                        <wsdl>src/main/resources/ReferenceDataService.wsdl</wsdl>
                        <bindingFiles>
                            <bindingFile>src/main/resources/bindings.xjb</bindingFile> 
                        </bindingFiles>
                        <extraargs>
                            <extraarg>-xjc-Xannotate</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics</artifactId>
            <version>1.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-annotate</artifactId>
            <version>1.0.2</version>
        </dependency>
    </dependencies>
</plugin>


2 commentaires

Merci beaucoup pour l'échantillon. Malheureusement, je n'arrive pas à le faire fonctionner (après avoir changé les noms na dNS pour correspondre à mon projet évidemment), c'est-à-dire que l'exécution est effectuée sans erreur mais la classe manquante dans l'annotation est toujours manquante. Seriez-vous en mesure de le faire fonctionner dans l'exemple de projet que j'ai fourni? Merci beaucoup de toute façon.


Je n'ai pas pu effectuer de push sur votre projet, je vais donc écrire une autre réponse ici.



1
votes

J'ai explicitement écrasé les classes générées à partir de la génération WSDL par la génération XSD avec les annotations appropriées. Veuillez ajouter le texte entier à pom.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:annox="http://annox.dev.java.net" 
               xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
               version="2.1">

        <jaxb:bindings schemaLocation="wsdl\internet.xsd" node="/xsd:schema">
        <jaxb:bindings node="xsd:complexType[@name='FurtherExtensionOfBaseObj']">
                <annox:annotate target="class">
                    @javax.xml.bind.annotation.XmlSeeAlso({com.somehost.internet.zed.beans.MyZedRequest.class, com.somehost.internet.bar.beans.MyBarRequest.class})
                </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>


</jaxb:bindings>

Et créer le fichier bindings.xjb dans le dossier: xmlseealso-issue-poc \ src \ main \ ressources avec le code suivant:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>my-jax-ws</artifactId>
    <version>20190707-1950</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.1.17</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <wsdlRoot>src/main/resources/wsdl</wsdlRoot>
                            <includes>
                                <include>*.wsdl</include>
                            </includes>
                         </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-xjc-plugin</artifactId>
                <version>3.3.1</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>${basedir}/target/generated-sources/cxf</sourceRoot>
                            <xsdOptions>
                                <xsdOption>
                                    <xsd>src/main/resources/wsdl/internet.xsd</xsd>
                                    <bindingFiles>
                                        <bindingFile>src/main/resources/bindings.xjb</bindingFile>
                                    </bindingFiles>
                                    <extension>true</extension>
                                    <extensionArgs>
                                        <extensionArg>-Xannotate</extensionArg>
                                    </extensionArgs>
                                </xsdOption>
                            </xsdOptions>
                        </configuration>
                        <goals>
                            <goal>xsdtojava</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics</artifactId>
                        <version>1.11.1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-annotate</artifactId>
                        <version>1.0.2</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <id>auto-clean</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.2.7</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
</project>

J'espère que cela vous aidera.


1 commentaires

C'est à 100% ce que je cherchais, fonctionne comme un charme SAUF le fait que j'ai dû remplacer la barre oblique inverse que vous avez utilisée dans bindings.xjb lorsque vous donnez le schemaLocation ("wsdl \ internet.xsd") par une barre oblique régulière "wsdl /internet.xsd ".