J'utilise wsimport dans un projet Java pour générer des sources pour trois services Web SOAP. Les deux premiers fonctionnent correctement: j'utilise le plug-in JAX-WS Maven pour récupérer le fichier WSDL et générer les fichiers source Java correspondants.
Cela échoue pour un service Web; Je reçois l'erreur suivante:
[jaxws:wsimport]
Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl]
parsing WSDL...
src-resolve.4.2: Error resolving component 's:schema'. It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but components from this namespace are not referenceable from schema document 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'. If this is the incorrect namespace, perhaps the prefix of 's:schema' needs to be changed. If this is the correct namespace, then an appropriate 'import' tag should be added to 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'.
line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1
undefined element declaration 's:schema'
line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
undefined element declaration 's:schema'
line 127 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
undefined element declaration 's:schema'
line 142 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
La différence entre ce fichier WSDL et ceux qui fonctionnent réside dans les lignes indiquées dans le message d'erreur, lignes 80, 127 et 142:
<s:element ref="s:schema" />
Remarque: l’élément racine du fichier wsdl définit l’espace de nom "s" ainsi:
xmlns:s="http://www.w3.org/2001/XMLSchema"
J'ai fait ma recherche. Il semble que d’autres personnes aient eu des problèmes similaires, avec des solutions allant de "n’utilisez pas <s:element ref="s:schema" />
", à "utilisez une balise import", à une solution inconnaissable qui figurait apparemment sur le vieux forum Java.net , un incendie de la connaissance de la bibliothèque de Java alexandrienne de nos jours).
J'ai essayé de placer l'instruction d'importation suivante juste à l'intérieur de l'élément contenant les balises posant problème: <s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd" />
. wsimport me donne une nouvelle erreur:
[jaxws:wsimport]
Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl]
parsing WSDL...
Element "{http://www.w3.org/2001/XMLSchema}annotation" shows up in more than one properties.
line 248 of http://www.w3.org/2001/XMLSchema.xsd
The following location is relevant to the above error
line 242 of http://www.w3.org/2001/XMLSchema.xsd
Property "Any" is already defined. Use <jaxb:property> to resolve this conflict.
line 108 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
The following location is relevant to the above error
line 109 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
Property "Any" is already defined. Use <jaxb:property> to resolve this conflict.
line 184 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
The following location is relevant to the above error
line 185 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
Property "Any" is already defined. Use <jaxb:property> to resolve this conflict.
line 199 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
The following location is relevant to the above error
line 200 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
Les lignes 108 et 109 référencées dans cette erreur sont les suivantes: (les lignes 184-5, 199-200 sont similaires)
<s:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
<s:any minOccurs="1" namespace="urn:schemas-Microsoft-com:xml-diffgram-v1" processContents="lax" />
J'ai essayé de mettre à jour jaxws-maven-plugin de 1.10 à 2.2. Même problème.
Des idées? Avez-vous besoin d'informations supplémentaires? J'ai omis les fichiers pom.xml et Service.asmx.wsdl pour des raisons de brièveté, mais je pourrais les inclure s'ils contiennent des informations plus importantes.
Je vous remercie!
Voici une autre personne qui a le même problème , si cela peut aider les répondeurs potentiels . Voici encore un autre problème similaire. Je ne comprends pas vraiment cet article , mais il semble impliquer que je doive analyser le code XML SOAP manuellement! Horreur!
J'ai résolu ce problème en adaptant la méthode de Vivek Pandey à Maven, lors de la mise à jour vers le plug-in jaxws-maven-2.2. Je vais le répéter ici pour la postérité:
Placez ce fichier de personnalisation XJB (voir ci-dessous) dans votre répertoire de fichiers de liaison par défaut, et définissez wsimport pour le lier et http://www.w3.org/2001/XMLSchema.xsd .
Le contenu du fichier XML susmentionné, xsd.xjb, qui devrait figurer dans votre répertoire de fichiers de liaison par défaut, est le suivant (le crédit revient à Kohsuke):
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="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"
version="2.0">
<globalBindings>
<xjc:simple />
</globalBindings>
<bindings scd="~xsd:complexType">
<class name="ComplexTypeType"/>
</bindings>
<bindings scd="~xsd:simpleType">
<class name="SimpleTypeType"/>
</bindings>
<bindings scd="~xsd:group">
<class name="GroupType"/>
</bindings>
<bindings scd="~xsd:attributeGroup">
<class name="AttributeGroupType"/>
</bindings>
<bindings scd="~xsd:element">
<class name="ElementType"/>
</bindings>
<bindings scd="~xsd:attribute">
<class name="attributeType"/>
</bindings>
</bindings>
Voici la partie pertinente de mon fichier POM, avec les modifications notées:
<plugin>
<!-- CHANGE: updated groupId and version -->
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- CHANGE: added args tag to bind http://www.w3.org/2001/XMLSchema.xsd -->
<args>
<arg>-b</arg><arg>http://www.w3.org/2001/XMLSchema.xsd</arg>
</args>
<wsdlFiles>
<wsdlFile>erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlLocation>
<staleFile>${project.build.directory}/jaxws/stale/Service.asmx.stale</staleFile>
<!-- CHANGE: added bindingFiles tag to bind XJB customization, located at the default binding files directory, MyProject/src/jaxws/xsd.xjb . -->
<bindingFiles>
<bindingFile>xsd.xjb</bindingFile>
</bindingFiles>
</configuration>
<id>wsimport-generate-egtestreportengine</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
<target>2.0</target>
</configuration>
</plugin>
Pour que la solution de Nick fonctionne, vous devrez peut-être ajouter ces deux arguments jvm à votre pom.xmlSo lorsque vous rencontrez ces erreurs:
org.xml.sax.SAXParseException; systemId: http://www.w3.org/2001/XMLSchema.xsd ; numéro de ligne: 67; numéro de colonne: 11; DTD externe: Échec de lecture de la DTD externe 'XMLSchema.dtd', car l'accès 'http' n'est pas autorisé en raison d'une restriction définie par la propriété accessExternalDTD.
[WARNING] schema_reference: Impossible de lire le document de schéma 'xml.xsd', car l'accès 'http' n'est pas autorisé en raison d'une restriction définie par la propriété accessExternalSchema . ligne 91 de http://www.w3.org/2001/XMLSchema.xsd
Ajoutez-les simplement à votre pom.xml
-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all
<vmArgs>
<vmArg>-Djavax.xml.accessExternalDTD=all</vmArg>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
Le même problème avait-il été résolu avec la commande ci-dessous:
wsimport -b http://www.w3.org/2001/XMLSchema.xsd -b xsd.xjb service.wsdl
où xsd.xjb
fait référence à:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="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"
version="2.0">
<globalBindings>
<xjc:simple />
</globalBindings>
<bindings scd="~xsd:complexType">
<class name="ComplexTypeType"/>
</bindings>
<bindings scd="~xsd:simpleType">
<class name="SimpleTypeType"/>
</bindings>
<bindings scd="~xsd:group">
<class name="GroupType"/>
</bindings>
<bindings scd="~xsd:attributeGroup">
<class name="AttributeGroupType"/>
</bindings>
<bindings scd="~xsd:element">
<class name="ElementType"/>
</bindings>
<bindings scd="~xsd:attribute">
<class name="attributeType"/>
</bindings>
</bindings>
Si vous ne vous souciez pas vraiment de ce bit particulier des données de modèle, vous pourrez peut-être utiliser un fichier de liaisons JAXB pour indiquer à JAXB de mapper les bits incriminés sur des propriétés dont le type est DOM Element
plutôt que d'essayer de les lier aux données. cours JAXB normaux. Le guide JAXB non officiel comporte une section sur cette technique.
Cela semble fonctionner pour moi enfin. J'utilise Apache maven cfx plugin
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<additionalJvmArgs>
-Djavax.xml.accessExternalDTD=all
</additionalJvmArgs>
<sourceRoot>${basedir}/src/main/generated</sourceRoot>
<wsdlOptions>
<wsdlOption>
<extraargs>
<extraarg>-autoNameResolution</extraarg>
<extraarg>-impl</extraarg>
<extraarg>-verbose</extraarg>
<extraarg>-b</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
<extraarg>-p</extraarg>
<extraarg>com.nevado.travelstudio</extraarg>
</extraargs>
<!-- <bindingFiles> <bindingFile>${basedir}/src/main/resources/wsdl/mybindings.xjb</bindingFile>
</bindingFiles> -->
<wsdl>${basedir}/src/main/resources/wsdl/B2.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>
en plus de ces modifications, je devais créer jaxp.properties file dans le dossier ..Java/jdk/jre/lib avec la propriété suivante
-Djavax.xml.accessExternalDTD=all