Web services CXF web服务客户机:“;无法创建安全的XMLInputFactory“;

Web services CXF web服务客户机:“;无法创建安全的XMLInputFactory“;,web-services,cxf,woodstox,Web Services,Cxf,Woodstox,我按照说明编写了一个CXF web服务并将其部署到Tomcat服务器中。web服务部署得很好,因为我可以在web浏览器中看到WSDL文件 但是,我的独立Java客户端程序无法工作。代码如下: System.out.println("Creating client"); Properties properties = System.getProperties(); properties.put("org.apache.cxf.stax.allowInsecureParser", "1"); Sys

我按照说明编写了一个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命令中,但也没有成功。(也没有将其设置为“true”而不是1。)关于如何解决此错误的任何想法?

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

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

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

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

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

com.ctc.wstx*

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


从2.7.x CXF发行版中添加了stax2 apiwoodstox core aslJAR,Web服务再次工作。

在我的例子中,有两个JAR(CXF 3.0.1,Jboss 7.1.1)

stream:staxapi:jar:1.0-2:compile

org.codehaus.woodstox:stax2api:jar:3.1.4:compile

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

我也有类似的问题


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

如果升级到3.0.0或更高版本,则不应添加woodstock依赖项,CXF添加了一个特性,以确保XMLInputFactory是安全的,并从woodstox(>=4.2.x包,请参阅)加载,以处理

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

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


为了使类加载器更喜欢
woodstox
(ear/war lib)而不是
webservices-rt.jar
(j2ee lib),该解决方案取决于您的应用程序服务器,并且在中进行了描述,从我开始,我必须同时删除stax-api-1.0-2.jar(留下stax2-api-3.1.4.jar和woodstock 4 jar)并在其末尾的weblogic-application.xml中指定:

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

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

通过将此包添加到weblogic-application.xml,修复了此问题

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

com.ctc.wstx.*

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

事实证明,axis2传输http引入了这些冲突

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

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

org.apache.axis2
axis2传输http

此处没有说明我的问题的此错误消息的根本原因的答案。我们对两个新版本都有可传递的依赖关系 woodstox-core-asl-4.2.0.jar 古色古香 wstx-asl-3.2.1.jar

将旧版本从我们的构建中排除就成功了


如果你深入研究旧版本的内部,你会发现它失败了,出现了一个异常,该异常最终被另一个异常所包装,并带有一条信息量不大的通用消息。

我可以通过在我的应用程序的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>

false
com.ctc*


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

org.codehaus.woodstox
stax2 api
4.0.0
org.codehaus.woodstox
woodstox core asl
4.4.1

1:-Dorg.apache.cxf.stax.allowInsecureParser=1到JAVA_选项


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

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

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

只有我在客户端的类路径中提到的woodstox-core-asl-4.2.0.jar,我在JRE的lib目录中找不到任何woodstox*。你知道哪些CXF文件丢失了吗?我自己也有一个非常类似的问题;我通过取消排除
org.apache.cxf:cxf bundle jaxr
解决了我的问题。缺少哪些文件?我也求助于此解决方案。在我的例子中,问题是当Statuxutils尝试获取一个新的XMLInputFactory(
XMLInputFac)时