webservice client - from - Error de generación de cliente de servicio web con JDK8
java web service client from wsdl (21)
Ahora está arreglado en la versión 2.5 (lanzado en julio / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .
Para las versiones 2.4.x hay una solución (como se describe en https://github.com/mojohaus/jaxws-maven-plugin/issues/4 ):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.4.1</version>
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-tools</artifactId>
<version>2.2.10</version>
</dependency>
</dependencies>
</plugin>
Necesito consumir un servicio web en mi proyecto. Utilizo NetBeans, de modo que hice clic con el botón derecho en mi proyecto e intenté agregar un nuevo "Cliente de servicio web". La última vez que lo comprobé, esta era la forma de crear un cliente de servicio web. Pero resultó en un error de afirmación, diciendo:
java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar: file: /path/to/glassfish/modules/jaxb-osgi.jar! /com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; número de línea: 52; número de columna: 88; schema_reference: Error al leer el documento de esquema '' xjc.xsd '', porque el acceso a ''archivo'' no está permitido debido a la restricción establecida por la propiedad accessExternalSchema .
La plataforma Java predeterminada para NetBeans era JDK8 (la versión oficial de Oracle), así que cuando cambié mi archivo netbeans.conf e hice JDK7 (también de Oracle) como mi predeterminado, todo funcionó bien. Así que creo que el problema es con JDK8. Aquí está mi salida de java -version
:
versión java "1.8.0"
Java (TM) SE Runtime Environment (compilación 1.8.0-b132)
VM de servidor de 64 bits de Java HotSpot (TM) (compilación 25.0-b70, modo mixto)
Por ahora, mantengo JDK7 como mi plataforma Java predeterminada. Si hay una manera de hacer que JDK8 funcione, por favor, comparta.
Al usar Maven con IntelliJ IDE, puede agregar -Djavax.xml.accessExternalSchema=all
a la configuración de Maven en Opciones de JVM para la configuración de Maven Build Tools Runner
Aquí hay una sugerencia Sugerencia para usuarios de Gradle sin derechos de administrador: agregue esta línea a su tarea jaxb:
System.setProperty(''javax.xml.accessExternalSchema'', ''all'')
se verá así:
jaxb {
System.setProperty(''javax.xml.accessExternalSchema'', ''all'')
xsdDir = "${project.name}/xsd"
xjc {
taskClassname = "com.sun.tools.xjc.XJCTask"
args = ["-npa", "-no-header"]
}
}
Bueno, he encontrado la solución. (basado en http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )
Cree un archivo llamado jaxp.properties
(si no existe) en /path/to/jdk1.8.0/jre/lib
y luego escriba esta línea en él:
javax.xml.accessExternalSchema = all
Eso es todo. Disfruta de JDK 8.
Ejecuto compilaciones ant en Eclipse IDE (4.4, Luna, en Windows 7 x64). En lugar de modificar el lib JRE instalado o cualquier secuencia de comandos ant (tengo varios proyectos que incluyen XJC en sus versiones), prefiero cambiar la configuración de Eclipse en "Configuraciones de herramientas externas" y agregar lo siguiente a los argumentos de VM para la configuración de construcción Ant:
-Djavax.xml.accessExternalSchema=all
En mi caso añadiendo:
javax.xml.accessExternalSchema = all
a jaxp.properties no funcionó, tengo que agregar:
javax.xml.accessExternalDTD = all
Mi entorno es linux mint 17 y java 8 oracle. Lo pondré allí como una respuesta para las personas con el mismo problema.
Esto funciona en jdk1.8.0_65
wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Lo usé con un proyecto de Maven regular, y lo resolví con esta configuración de dependencia de plugin para ejecutar el xjc plugin
:
<plugin>
<!-- Needed to run the plugin xjc en Java 8 or superior -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<id>set-additional-system-properties</id>
<goals>
<goal>set-system-properties</goal>
</goals>
</execution>
</executions>
<configuration>
<properties>
<property>
<name>javax.xml.accessExternalSchema</name>
<value>all</value>
</property>
<property>
<name>javax.xml.accessExternalDTD</name>
<value>all</value>
</property>
</properties>
</configuration>
</plugin>
Los siguientes trabajos para wsimport 2.2.9 incluidos en jdk 1.8.0_66:
wsimport -J-Djavax.xml.accessExternalSchema=all ....
NetBeans actualiza su tutorial para JDK8 y este problema:
Introducción a los servicios web JAX-WS -> Habilitación del acceso a un esquema externo
No es una respuesta real sino más como referencia.
Si está utilizando el complemento jaxws Maven y recibe el mismo mensaje de error, agregue la propiedad mencionada a la configuración del complemento:
...
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<!-- Needed with JAXP 1.5 -->
<vmArgs>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
</configuration>
</plugin>
Otra alternativa es actualizar el script de shell wsimport.sh agregando lo siguiente:
El wsimport.sh se encuentra en este directorio:
jaxws-ri.2.2.28 / bin
exec "$ JAVA" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME / lib / jaxws-tools.jar" "$ @"
Otra referencia: si está utilizando el maven-jaxb2-plugin
, antes de la versión 0.9.0, puede usar la solución alternativa descrita en este problema , en la que este comportamiento afectó al complemento.
Para aquellos que usan la tarea ANT wsimport
, una forma de pasar la opción como lo sugiere @CMFly y se especifica en la documentation es la siguiente:
<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Probé esto para la versión 2.4 del artefacto org.codehaus.mojo y funcionó ~
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>path/to/dir/wsdl</wsdlDirectory>
</configuration>
<id>wsimport-web-service</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>${webservices-api-version}</version>
</dependency>
</dependencies>
<configuration>
<vmArgs>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
<sourceDestDir>generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<sei>/</sei>
</configuration>
</plugin>
</plugins>
Si está usando ant, puede agregar un jvmarg a sus llamadas java:
<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
Si tiene este problema al convertir wsdl a jave con el cxf-codegen-plugin , entonces puede resolverlo configurando el complemento a la bifurcación y proporcione la opción "-Djavax.xml.accessExternalSchema = all" JVM.
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<fork>always</fork>
<additionalJvmArgs>
-Djavax.xml.accessExternalSchema=all
</additionalJvmArgs>
También recibía un tipo de error similar en Eclipse durante la prueba de un programa de servicio web en el servidor web glassfish 4.0: java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: bundle://158.0:1/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: Failed to read schema document ''xjc.xsd'', because ''bundle'' access is not allowed due to restriction set by the accessExternalSchema property.
java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: bundle://158.0:1/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: Failed to read schema document ''xjc.xsd'', because ''bundle'' access is not allowed due to restriction set by the accessExternalSchema property.
He agregado javax.xml.accessExternalSchema = All
en jaxp.properties
, pero no funciona para mí.
Sin embargo, aquí encontré una solución que me funciona: para GlassFish Server, necesito modificar el domain.xml
del GlassFish, ruta: <path>/glassfish/domains/domain1
o domain2/config/domain.xml
) y agregar , <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
bajo la etiqueta <java-config>
....
<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config>
... y luego reinicie el servidor GlassFish
Una solución portátil muy simple sería colocar la siguiente línea de código en una parte crucial de su código, una parte de la cual está seguro de que se ejecutará (por ejemplo, directamente en el método principal):
System.setProperty("javax.xml.accessExternalDTD", "all");
Esto establece la propiedad del sistema necesaria de forma programática, sin tener que hacer cambios difíciles de pom.xml de maven (que por alguna razón no me funcionó).
Habilitar el acceso a un esquema externo
Debe habilitar el IDE y el servidor GlassFish para acceder al esquema externo para analizar el archivo WSDL del servicio web. Para habilitar el acceso, necesita modificar los archivos de configuración del IDE y del servidor GlassFish. Para obtener más detalles, consulte la sección de preguntas frecuentes ¿Cómo habilitar el análisis de WSDL con un esquema externo? Configurando el IDE
Para generar un cliente de servicio web en el IDE a partir de un servicio web o archivo WSDL, debe modificar el archivo de configuración IDE (netbeans.conf) para agregar el siguiente cambio a netbeans_default_options.
-J-Djavax.xml.accessExternalSchema=all
Para obtener más información sobre la ubicación y modificación del archivo de configuración netbeans.conf, consulte las Preguntas frecuentes sobre la configuración de Netbeans. Configurando el servidor GlassFish
Si está implementando en el servidor GlassFish, necesita modificar el archivo de configuración del servidor GlassFish (domain.xml) para permitir que el servidor acceda a esquemas externos para analizar el archivo wsdl y generar el cliente de prueba. Para habilitar el acceso a esquemas externos, abra el archivo de configuración de GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) y agregue el siguiente elemento de opción JVM (en negrita). Deberá reiniciar el servidor para que el cambio surta efecto.
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Otra solución para abordar: wiki.netbeans.org
El asistente del cliente de servicio web en el IDE analiza el archivo WSDL al generar un cliente de servicio web desde un servicio web o archivo WSDL. Debe modificar el archivo de configuración IDE (netbeans.conf) para agregar el siguiente cambio a netbeans_default_options. Deberá reiniciar el IDE para que el cambio surta efecto.
-J-Djavax.xml.accessExternalSchema=all
Al implementar en GlassFish, debe habilitar el acceso a un esquema externo para generar un cliente de prueba para un servicio web. Para habilitar el acceso, debe modificar el archivo de configuración del servidor de GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) y agregar el siguiente elemento de opción de JVM. Deberá reiniciar el servidor para que el cambio surta efecto.
</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>