28

我使用此处的说明编写并部署了 CXF Web 服务到 Tomcat 服务器中。Web 服务部署良好,因为我可以在 Web 浏览器中看到 WSDL 文件。

但我的独立 Java 客户端程序不起作用。这是代码:

System.out.println("Creating client");
Properties properties = System.getProperties();
properties.put("org.apache.cxf.stax.allowInsecureParser", "1");
System.setProperties(properties);
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ExampleWebService.class);
factory.setAddress("http://X.X.X.X:9090/WebServices/ExampleWebService");
ExampleWebService exampleWebService = (ExampleWebService)factory.create();
System.out.println("Done creating client");
exampleWebService.method1("test");
System.out.println("After calling method1");

我将 CXF 2.7.7 发行版中的所有 jar 文件(包括 woodstox-core-asl-4.2.0.jar 文件)复制到客户端程序的类路径中,当我运行客户端时,出现以下异常:

Creating client
Nov 20, 2013 8:05:26 PM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
INFO: Creating Service {http://webservices.server/}ExampleWebServiceService from class server.webservices.ExampleWebService
Done creating client
javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157)
    at $Proxy38.printString(Unknown Source)
    at ExampleNmsWebServiceClient.printString(ExampleNmsWebServiceClient.java:29)
    at ExampleNmsWebServiceClient.main(ExampleNmsWebServiceClient.java:40)
Caused by: org.apache.cxf.binding.soap.SoapFault: Cannot create a secure XMLInputFactory
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:835)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1606)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1502)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:627)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
    ... 3 more

我发现一个页面说“无法创建安全的 XMLInputFactory”可以通过将 org.apache.cxf.stax.allowInsecureParser 属性设置为“1”来修复,这就是我尝试在系统属性中设置它的原因,但这并没有不行。我还尝试将 -Dorg.apache.cxf.stax.allowInsecureParser=1 添加到运行客户端的 java 命令中,但这也不起作用。(也没有将其设置为“true”而不是 1。)关于如何解决此错误的任何想法?

4

17 回答 17

28

从 CXF 2.3.x 升级到 2.7.x 时出现此问题

从 2.7.x CXF 发行版中添加了 stax2-apiwoodstox-core-asl jar,并且 web 服务再次运行。

于 2014-07-07T04:38:58.127 回答
22

从版本 2.7.4 开始,CXF 添加了一项功能,以确保 XMLInputFactory 受到保护并从 woodstox(>= 4.2.x 包,请参阅StaxUtil 实现)加载,以处理拒绝服务漏洞

但事实是,在 J2EE 环境中,默认情况下,webservices-rt.jar优先级高于战争库(然后高于 woodstock jar)。这就是加载非安全实现并触发异常的原因。

关闭 org.apache.cxf.stax.allowInsecureParser 属性不是一个选项,因为它会带回 DOS 漏洞。

为了使类加载器更喜欢woodstox(ear/war lib) 而不是webservices-rt.jar(j2ee lib),解决方案取决于您的应用程序服务器,并在CXF 应用程序服务器特定配置指南中进行了描述

于 2015-01-28T11:18:25.997 回答
20

我有类似的问题

将其添加-Dorg.apache.cxf.stax.allowInsecureParser=1JAVA_OPTIONSin 后setDomainEnv.sh,它现在工作正常。

于 2014-10-30T22:38:50.590 回答
13

我在 weblogic 上遇到了这个问题,并通过将它添加到我的 weblogic-application.xml 来解决这个问题

<prefer-application-packages>
       <package-name>com.ctc.wstx.*</package-name>
</prefer-application-packages>
于 2014-04-22T17:34:40.930 回答
9

检查可能在类路径或 jre 的 lib/endorsed 或类似文件中找到的任何其他版本的 woodstox。听起来可能会选择较旧的 4.1 版本。

于 2013-11-21T14:34:27.977 回答
5

当我将 CXF 升级到 2.7.x 时,我遇到了同样的问题。我通过在 POM 中添加以下依赖项解决了这个问题

<dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>stax2-api</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>woodstox-core-asl</artifactId>
    <version>4.4.1</version>
</dependency>
于 2016-02-01T10:49:49.213 回答
4

这里没有描述我的问题的此错误消息的根本原因的答案。我们对新版本 woodstox-core-asl-4.2.0.jar 和旧 wstx-asl-3.2.1.jar 都有传递依赖

从我们的构建中排除旧版本就可以了。

如果您深入研究旧版本的内容,您会发现它失败并出现异常,最终被包含在另一个异常中,此通用消息信息量不大。

于 2015-10-10T18:44:28.823 回答
2

我遇到了这个问题,这是因为当我从旧版本的 cxf 升级时,我没有在客户端类路径中将 stax-api-*.jar 更改为 stax2-api-*.jar。

于 2014-03-17T14:19:27.673 回答
2

如果升级到 3.0.0 或更高版本,则不应添加woodstock依赖项

于 2014-12-18T08:20:54.323 回答
0

我在 weblogic 上遇到了这个问题,应用程序成功部署,但是当我触发了肥皂请求时,我遇到了这个错误:无法创建安全的 XMLInputFactory。

通过将此包添加到 weblogic-application.xml 来解决问题

com.ctc.wstx.*

于 2015-04-07T07:21:08.120 回答
0

就我而言,有两个罐子(Cxf 3.0.1,Jboss 7.1.1)

javax.xml.stream:stax-api:jar:1.0-2:compile

org.codehaus.woodstox:stax2-api:jar:3.1.4:compile

我删除了第一个并开始工作

于 2014-10-30T13:16:23.917 回答
0

从我的角度来看,我必须同时删除 stax-api-1.0-2.jar(留下 stax2-api-3.1.4.jar 和 woodstock 4.4 jar)并在其末尾的 weblogic-application.xml 中指定:

     .
     .
     <package-name>com.ctc.wstx.*</package-name>  
     <package-name>org.codehaus.stax2.*</package-name>
 </prefer-application-packages>
于 2015-03-20T00:07:51.927 回答
0

问题是服务器上的 Web 服务部署中缺少一些 CXF jar 文件。这很难调试,因为服务器上没有错误。

于 2013-11-22T02:44:49.423 回答
0

我查看了我的依赖项以查找与woodstox 或stax-api 的版本冲突。

事实证明,axis2-transport-http 引入了这些冲突。

如果您碰巧也有此依赖项,请将以下排除项添加到引入它的 pom 依赖项中

<exclusions>
            <exclusion>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-transport-http</artifactId>
            </exclusion>
        </exclusions>
于 2015-06-23T14:48:13.550 回答
0

我可以通过在我的应用程序的 WEB-INF 文件夹中添加 weblogic.xml 来解决这个问题,代码如下:

<prefer-web-inf-classes>false</prefer-web-inf-classes>

<prefer-application-packages>
    <package-name>com.ctc.*</package-name>
</prefer-application-packages>

于 2015-10-28T21:18:21.403 回答
0

有趣的是,我在 docker 容器中遇到了这个问题,而不是在 tomcat 服务器上运行它时。

我面临的问题是该项目有另一个较低版本的 wstx-asl-3.2.7 并且类加载器可能首先加载了这个版本。我摆脱了它,并考虑了必要的woodstox,问题就解决了。

于 2020-06-18T13:18:47.870 回答
-1

1:-Dorg.apache.cxf.stax.allowInsecureParser=1 到 JAVA_OPTIONS

2:重命名 woodstox-core-asl-4.4.1.jar -> awoodstox-core-asl-4.4.1.jar

于 2016-12-02T10:19:54.063 回答