net jax from example ejemplo consume java jaxb wsdl jax-ws wsimport

java - jax - wsimport https



Error de JAX-WS en el archivo WSDL: "Error al resolver los componentes: esquema" (5)

El error

Estoy utilizando wsimport en un proyecto Java para generar fuentes para tres servicios web SOAP. Los dos primeros funcionan bien: uso el complemento JAX-WS Maven para capturar el archivo WSDL y generar los archivos fuente Java correspondientes.

Esto falla para un servicio web; Obtuve el siguiente error:

[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

El culpable

La diferencia entre este archivo WSDL y los que funcionan es lo que está en las líneas anotadas en el mensaje de error, líneas 80, 127 y 142:

<s:element ref="s:schema" />

Nota: el elemento raíz del archivo wsdl define el espacio de nombres "s" así:

xmlns:s="http://www.w3.org/2001/XMLSchema"

Lo que he intentado

Ya hice mi búsqueda. Parece que otras personas han tenido problemas similares, con soluciones desde "simplemente no use <s:element ref="s:schema" /> ", para "usar una etiqueta de importación", hasta alguna solución desconocida que aparentemente estaba en el antiguo foro java.net (antes de que fuera derribado, un incendio provocado por el conocimiento moderno de la Biblioteca de Java de Alejandría).

  • He intentado colocar la siguiente declaración de importación justo dentro del elemento que contiene las etiquetas problemáticas: <s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd" /> . wsimport me da un nuevo error:

    [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 &lt;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 &lt;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 &lt;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

    Las líneas 108 y 109 a las que se hace referencia en este error son: (las líneas 184-5, 199-200 son similares)

    <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" />

  • He intentado actualizar jaxws-maven-plugin de 1.10 a 2.2. El mismo problema.

  • Aquí hay una posible solución : estoy tratando de descubrir cómo implementar esto utilizando el complemento JAX-WS Maven. ¿Alguna pista?

Conclusión

¿Algunas ideas? ¿Necesitas más información? He omitido los archivos pom.xml y Service.asmx.wsdl por brevedad, pero podría incluirlos si hay información más importante en ellos.

¡Gracias!

Addenda

Aquí hay otra persona que tiene el mismo problema , si esto es útil para los posibles respondedores. Aquí hay otro problema similar. Realmente no entiendo este artículo , ¡pero parece implicar que tengo que analizar el SOAP XML manualmente! ¡Horror!


Esto parece estar funcionando para mí finalmente. Estoy usando el complemento cfx de apache maven

<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>

junto con estos cambios tuve que crear el archivo jaxp.properties en la carpeta ..java / jdk / jre / lib con la siguiente propiedad

-Djavax.xml.accessExternalDTD=all


Para que la solución de Nick funcione, es posible que tenga que agregar estos dos argumentos jvm a su pom.xml Entonces, cuando encuentre esos errores:

org.xml.sax.SAXParseException; ID de sistema: http://www.w3.org/2001/XMLSchema.xsd ; número de línea: 67; número de columna: 11; DTD externa: Error al leer la DTD externa ''XMLSchema.dtd'', porque el acceso ''http'' no está permitido debido a la restricción establecida por la propiedad accessExternalDTD.

[ADVERTENCIA] schema_reference: Error al leer el documento de esquema ''xml.xsd'', porque el acceso ''http'' no está permitido debido a la restricción establecida por la propiedad accessExternalSchema. línea 91 de http://www.w3.org/2001/XMLSchema.xsd

Solo agrégalos a tu pom.xml

-Djavax.xml.accessExternalDTD=all -Djavax.xml.accessExternalSchema=all <vmArgs> <vmArg>-Djavax.xml.accessExternalDTD=all</vmArg> <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> </vmArgs>


Resolví esto adaptando el método de Vivek Pandey a Maven, mientras actualizaba al jaxws-maven-plugin 2.2. Lo reiteraré aquí para la posteridad:

Resumen

Coloque este archivo de personalización XJB (ver más abajo) en su directorio de archivos de enlace predeterminado, y configure wsimport para enlazarlo y http://www.w3.org/2001/XMLSchema.xsd .

Personalización XJB

El contenido del archivo XML mencionado anteriormente, xsd.xjb, que debe ir en su directorio de archivos de enlace predeterminado, es el siguiente (el crédito va a 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>

POM

Aquí está la parte relevante de mi archivo POM, con cambios notados:

<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>


Si realmente no le importa este bit particular de los datos del modelo, podría usar un archivo de enlaces JAXB para decirle a JAXB que asigne los bits ofensivos a propiedades cuyo tipo es un Element DOM en lugar de intentar realmente enlazarlos. Clases normales de JAXB. La guía no oficial JAXB tiene una sección sobre esta técnica.


Tenía el mismo problema arreglado con el siguiente comando:

wsimport -b http://www.w3.org/2001/XMLSchema.xsd -b xsd.xjb service.wsdl

donde xsd.xjb refiere a:

<?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>