CXF Web服务客户端:“无法创建安全的XMLInputFactory”

时间:2013-11-21 07:30:15

标签: web-services cxf woodstox

我使用说明here编写并将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");

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

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命令中,但这也不起作用。 (也没有将其设置为“真实”而不是1.)关于如何解决此错误的任何想法?

17 个答案:

答案 0 :(得分:24)

从CXF 2.3.x升级到2.7.x

时出现此问题

从2.7.x CXF发行版中添加了 stax2-api woodstox-core-asl jars,并且webservice再次运行。

答案 1 :(得分:18)

从版本2.7.4开始,CXF添加了一项功能,以确保XMLInputFactory受到woodstox的保护和加载(> = 4.2.x包,请参阅StaxUtil implementation)以便处理{{ 3}}

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

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

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

答案 2 :(得分:16)

我有类似的问题

将此-Dorg.apache.cxf.stax.allowInsecureParser=1添加到JAVA_OPTIONS中的setDomainEnv.sh后,现在工作正常。

答案 3 :(得分:13)

我在weblogic上遇到此问题,并通过将此问题添加到我的weblogic-application.xml

来解决问题
<prefer-application-packages>
       <package-name>com.ctc.wstx.*</package-name>
</prefer-application-packages>

答案 4 :(得分:9)

检查可能在类路径或jre的lib /背书或类似内容中找到的任何其他版本的woodstox。听起来好像可以拿到旧的4.1版本。

答案 5 :(得分:4)

当我将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>

答案 6 :(得分:4)

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

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

如果你深入研究旧版本的内容,你会发现它失败并带有异常,最终被这个通用消息包含在另一个异常中,而这个异常消息并不是很有用。

答案 7 :(得分:2)

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

答案 8 :(得分:2)

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

答案 9 :(得分:0)

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

我遇到的问题是该项目具有另一个较低版本的wstx-asl-3.2.7,而类加载器可能首先已加载此版本。 我摆脱了它,并考虑了必要的伍德斯托克,问题得以解决。

答案 10 :(得分: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>

答案 11 :(得分:0)

我浏览了我的依赖项,找到与woodstox或stax-api的版本冲突。

原来,axis2-transport-http引入了这些冲突。

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

<exclusions>
            <exclusion>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-transport-http</artifactId>
            </exclusion>
        </exclusions>

答案 12 :(得分:0)

我在weblogic上遇到了这个问题,Application get Deployed Successfully但是当我解雇了soap-request然后我遇到了这个错误:无法创建一个安全的XMLInputFactory。

通过将此包添加到weblogic-application.xml

来解决问题

com.ctc.wstx。*

答案 13 :(得分:0)

从我的结尾,我不得不删除stax-api-1.0-2.jar(留下stax2-api-3.1.4.jar&amp; woodstock 4.4 jar)并在weblogic-application.xml中指定结束:

     .
     .
     <package-name>com.ctc.wstx.*</package-name>  
     <package-name>org.codehaus.stax2.*</package-name>
 </prefer-application-packages>

答案 14 :(得分:0)

在我的案例中有两个罐子(Cxf 3.0.1,Jboss 7.1.1)

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

org.codehaus.woodstox:stax2-API:罐:3.1.4:编译

我删除了第一个,它开始工作

答案 15 :(得分:0)

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

答案 16 :(得分:-1)

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

2:重命名woodstox-core-asl-4.4.1.jar - &gt; awoodstox核-ASL-4.4.1.jar

相关问题