Client de service web CXF: "ne peut pas créer un XMLInputFactory sécurisé"

j'ai écrit et déployé un service web CXF dans un serveur Tomcat en utilisant les instructions ici. Le service Web se déploie très bien car je peux voir le fichier WSDL dans un navigateur web.

mon programme client Java autonome ne fonctionne pas. Voici le code:

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");

j'ai copié tous les fichiers jar (y compris le woodstox-core-asl-4.2.0.jar file) à partir de la distribution CXF 2.7.7 dans classpath du programme client, et quand j'exécute le client je reçois le exception suivante:

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

j'ai trouvé une page disant que le "ne peut pas créer un XMLInputFactory sécurisé" peut être corrigé en définissant l'org.Apache.cxf.stax.allowInsecureParser propriété à "1", c'est pourquoi j'ai essayé de le définir dans les propriétés du système, mais cela n'a pas fonctionné. J'ai aussi essayé d'ajouter -Dorg.Apache.cxf.stax.allowInsecureParser=1 à la commande java qui exécute le client, mais cela n'a pas fonctionné non plus. (Il n'a pas non plus été possible de définir "true" au lieu de 1.) Toutes les idées sur la façon de résoudre ce d'erreur?

20
demandé sur pacoverflow 2013-11-21 11:30:15

16 réponses

Eu ce problème lors de la mise à niveau de CXF 2.3.x à 2.7.x

Ajouté stax2-api et woodstox-core-asl pots de la 2.7.x CXF distribution et le webservice fonctionne à nouveau.

22
répondu Lund Wolfe 2014-07-07 04:38:58

depuis la version 2.7.4, CXF a ajouté une fonctionnalité pour s'assurer que XMLInputFactory est sécurisé et chargé à partir de woodstox (>= 4.2.paquets x, reportez-vous à StaxUtil mise en œuvre) afin de traiter avec un vulnérabilité de déni de Service

Mais le fait est que, dans un environnement J2EE, par défaut, webservices-rt.jar a la priorité sur war libs (et ensuite sur le pot de woodstock). C'est pourquoi l'implémentation non sécurisée est chargée, déclenchant exception.

désactiver l'org.Apache.cxf.stax.allowInsecureParser propriété,n'est pas une option car il ramène la vulnérabilité DOS.

pour rendre le chargeur de classe à préférer woodstox (oreille/guerre lib) sur webservices-rt.jar j2ee (lib), la solution dépend de votre serveur d'applications et est décrite dans CXF le serveur d'application spécifique guide de configuration

18
répondu yunandtidus 2015-01-28 11:18:25

j'ai eu le même problème

après ajout de ce -Dorg.apache.cxf.stax.allowInsecureParser=1JAVA_OPTIONS