使用 JDK8 的 WebService 客户端报错

我需要在项目中使用web服务。我使用NetBeans,所以我右键单击我的项目,并尝试添加一个新的“Web服务客户端”。上次我检查时,这是创建web服务客户机的方法。但它导致了一个AssertionError,说:

java.lang.AssertionError: org.xml.sax.SAXParseException;systemId: jar文件:/道路/ / glassfish /模块/ jaxb-osgi.jar ! / com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;lineNumber: 52个;columnNumber: 88;schema_reference:读取模式文档'xjc.xsd'失败,因为由于accessExternalSchema属性设置的限制,不允许访问'文件'。

NetBeans的默认Java平台是JDK8 (Oracle的官方版本),所以当我更改NetBeans .conf文件并将JDK7(也来自Oracle)作为我的默认平台时,一切都工作得很好。所以我认为问题出在JDK8上。下面是我的java -version输出:

java version "1.8.0"
Java(TM) SE运行时环境(build 1.8.0-b132)
Java HotSpot(TM) 64位服务器虚拟机(build 25.0-b70,混合模式)

目前,我将JDK7作为默认的Java平台。如果有让JDK8工作的方法,请分享。

190325 次浏览

我找到解决办法了。(基于http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA)

/path/to/jdk1.8.0/jre/lib下创建一个名为jaxp.properties的文件(如果它不存在),然后在其中写入这一行:

javax.xml.accessExternalSchema = all

这是所有。享受JDK 8吧。

在glassfish 4.0 web服务器上测试web服务程序时,我也在Eclipse中得到了类似类型的错误: 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. < / p >

我已经在jaxp.properties中添加了javax.xml.accessExternalSchema = All,但不适合我。

然而,我在这里找到了一个适合我的解决方案: 对于GlassFish服务器,我需要修改GlassFish的domain.xml, 路径:<path>/glassfish/domains/domain1domain2/config/domain.xml),并在<java-config>标签

下添加__abc2
....
< p > <代码> & lt; java-config> ... & lt; jvm-options> -Djavax.xml.accessExternalSchema = all< / jvm-options> & lt; / java-config> ...然后重启GlassFish服务器

如果你正在使用ant,你可以在你的java调用中添加一个jvmarg:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />

我在Eclipse IDE (4.4, Luna, Windows 7 x64)中运行蚂蚁构建。与其修改已安装的JRE库或任何ant脚本(我有多个项目,它们的构建中包含XJC),我更喜欢更改Eclipse设置“外部工具配置”,并将以下内容添加到ant构建配置的VM参数中:

-Djavax.xml.accessExternalSchema=all

另一个解决方案的地址:wiki.netbeans.org

当从Web服务或WSDL文件生成Web服务客户端时,IDE中的Web服务客户端向导将解析WSDL文件。需要修改IDE配置文件(netbeans.conf),将以下开关添加到netbeans_default_options. conf中。您需要重新启动IDE才能使更改生效。

-J-Djavax.xml.accessExternalSchema=all

当部署到GlassFish时,您需要启用对外部模式的访问,以便为web服务生成测试客户端。要启用访问,您需要修改GlassFish服务器的配置文件(GLASSFISH_INSTALL/ GlassFish /domains/domain1/config/domain.xml),并添加以下JVM选项元素。您需要重新启动服务器才能使更改生效。

</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

另一个替代方案是通过添加以下内容更新wsimport.sh shell脚本:

wsimport.sh位于这个目录下:

jaxws-ri.2.2.28 / bin

执行“$JAVA”$WSIMPORT_OPTS -Djavax.xml。accessExternalSchema=all -jar "$JAXWS_HOME/lib/jaxws-tools.jar" "$@"

不是一个实际的答案,更多的是作为一个参考。

如果您正在使用jaxws Maven插件,并且得到相同的错误消息,请将上述属性添加到插件配置中:

...
<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>
< p >另一个参考: 如果你正在使用maven-jaxb2-plugin,在0.9.0版本之前,你可以使用描述的变通方法在这个问题上,其中此行为会影响插件

NetBeans更新了JDK8的教程和以下问题:

JAX-WS Web服务入门->启用对外部模式的访问

我在一个常规的maven项目中使用它,并通过运行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>

如果你在使用cxf-codegen-plugin将wsdl转换为jave时遇到了这个问题,那么你可以通过配置插件来分叉并提供额外的“-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>

下面的代码适用于jdk 1.8.0_66中包含的wsimport 2.2.9:

wsimport -J-Djavax.xml.accessExternalSchema=all ....

在IntelliJ IDE中使用Maven时,可以在Maven构建工具运行器配置的JVM选项下将-Djavax.xml.accessExternalSchema=all添加到Maven设置中

在我的例子中添加:

javax.xml.accessExternalSchema = all

jaxp。属性没有工作,我必须补充:

javax.xml.accessExternalDTD = all

我的环境是linux mint 17和java 8 oracle。 我会把它放在那里,作为有同样问题的人的答案

我在2.4版的artifact org.codehaus.mojo上测试了这个功能,效果很好~

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

对于没有管理员权限的gradle用户,这里有一个提示:将这一行添加到你的jaxb-task中:

System.setProperty('javax.xml.accessExternalSchema', 'all')

它看起来是这样的:

jaxb {
System.setProperty('javax.xml.accessExternalSchema', 'all')
xsdDir = "${project.name}/xsd"
xjc {
taskClassname = "com.sun.tools.xjc.XJCTask"
args = ["-npa", "-no-header"]
}
}

这适用于jdk1.8.0_65

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl

对于那些使用ANT任务wsimport的人来说,传递@CMFly建议并在文档中指定的选项的方法如下:

<wsimport
<!-- ... -->
fork="true"
>
<jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>

一个非常简单的可移植的解决方案是,将下面这行代码放在你的代码的关键部分,其中一部分你肯定会运行(例如在main方法中):

System.setProperty("javax.xml.accessExternalDTD", "all");

这将以编程方式设置所需的系统属性,而不必进行棘手的maven pom.xml更改(出于某种原因,这对我不起作用)。

它现在在2.5版本(发布于17年7月)中得到了修复。https://github.com/mojohaus/jaxws-maven-plugin/issues/8

对于2.4。x版本中有一个变通方法(如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>

启用对外部模式的访问

您需要使IDE和GlassFish Server能够访问外部模式来解析web服务的WSDL文件。要启用访问,您需要修改IDE和GlassFish服务器的配置文件。有关更多详细信息,请参阅FAQ如何使用外部模式启用WSDL解析? 配置IDE

. conf

要从web服务或WSDL文件在IDE中生成web服务客户端,您需要修改IDE配置文件(netbeans.conf),将以下开关添加到netbeans_default_options中。

-J-Djavax.xml.accessExternalSchema=all

有关查找和修改Netbeans . Conf配置文件的更多信息,请参见Netbeans Conf FAQ。 配置GlassFish服务器

如果您部署到GlassFish服务器,您需要修改GlassFish服务器的配置文件(domain.xml),以使服务器能够访问外部模式来解析wsdl文件并生成测试客户端。要启用对外部模式的访问,打开GlassFish配置文件(GLASSFISH_INSTALL/ GlassFish /domains/domain1/config/domain.xml)并添加以下JVM选项元素(粗体部分)。您需要重新启动服务器才能使更改生效。

</java-config>
...
<jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

我刚刚尝试过,如果你使用SoapUI (5.4.x)并使用Apache CXF工具来生成java代码,将javax.xml.accessExternalSchema = all放在YOUR_JDK/jre/lib/jaxp.properties文件中也可以。

创建一个名为jaxp.properties的文件(如果不存在的话)在你的“JDK version/jre/lib"然后把下面这行加进去。

javax.xml.accessExternalSchema = all

如果你正在使用Intellij IDEA,在maven工具窗口

enter image description here

选择Maven Settings,展开Maven下拉菜单,选择Runner

enter image description here

VM Options下添加-Djavax.xml.accessExternalSchema=all . conf