Клиент веб-службы CXF: не удается создать безопасный XMLInputFactory

Я написал и развернул веб-службу CXF на сервере Tomcat, используя инструкции здесь. Веб-служба развертывается нормально, поскольку я вижу файл 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.) Любые идеи о том, как решить эту ошибку?


person pacoverflow    schedule 21.11.2013    source источник


Ответы (17)


Была эта проблема при обновлении с CXF 2.3.x до 2.7.x

Добавлены jar-файлы stax2-api и woodstox-core-asl из дистрибутива 2.7.x CXF, и веб-сервис снова работает.

person Lund Wolfe    schedule 07.07.2014
comment
5 лет спустя, в 2019 году, у меня возникла эта проблема с CXF 3.3.3. В дополнение к добавлению двух зависимостей мне также нужно было ИСКЛЮЧИТЬ другие библиотеки stax-api, woodstox и wstx из других зависимостей, которые включали их старые версии. Цель maven dependency:tree помогла мне понять это. - person peedee; 21.10.2019

у меня была похожая проблема

После добавления этого -Dorg.apache.cxf.stax.allowInsecureParser=1 к JAVA_OPTIONS в setDomainEnv.sh теперь все работает нормально.

person Krish    schedule 30.10.2014
comment
Я тоже прибегал к этому решению. В моем случае проблема заключалась в том, что когда StaxUtils пытается получить новую XMLInputFactory (XMLInputFactory.newInstance();), она получает WstxInputFactory из моего webservices-rt-2.3.jar, а не безопасную версию из woodstox-core-asl-4.4.1.jar. К сожалению, мне понадобился webservices-rt для другого кода, поэтому пришлось прибегнуть к этому решению. Apache CXF может быть такой головной болью, когда дело доходит до конфликтов зависимостей. - person uncrase; 03.12.2014

Начиная с версии 2.7.4, в CXF добавлена ​​функция, обеспечивающая защиту XMLInputFactory и ее загрузку из пакетов woodstox (>= 4.2.x, см. реализация StaxUtil), чтобы иметь дело с Отказ в обслуживании

Но дело в том, что в среде J2EE по умолчанию webservices-rt.jar имеет приоритет над war libs (а потом и над jar вудстоком). Вот почему загружается незащищенная реализация, вызывающая исключение.

Отключение свойства org.apache.cxf.stax.allowInsecureParser не является вариантом, поскольку оно возвращает уязвимость DOS.

Чтобы заставить загрузчик классов предпочитать woodstox (ear/war lib) вместо webservices-rt.jar (j2ee lib), решение зависит от вашего сервера приложений и описано в Руководство по настройке конкретного сервера приложений CXF

person yunandtidus    schedule 28.01.2015
comment
+1 за наиболее полное объяснение, allowInsecureParser мне подходит, так как мне это нужно только для локальной отладки. - person macias; 10.04.2015
comment
Нужен ли Tomcat этот порядок загрузчика классов? - person dotmindlabs; 01.08.2017
comment
Мне никогда не нужно было упорядочивать загрузчик классов на tomcat 7 или 8.5 с CXF. - person lrxw; 25.09.2017

У меня была эта проблема с weblogic, и я исправил ее, добавив ее в свой weblogic-application.xml.

<prefer-application-packages>
       <package-name>com.ctc.wstx.*</package-name>
</prefer-application-packages>
person ghost_1989    schedule 22.04.2014
comment
как можно добиться того же в jboss, что и 7.1.1.Final... есть идеи? - person robert; 27.04.2015
comment
Небольшое примечание: пакет com.ctc.wstx.* используется woodstox-core-asl, который загружается cxf-api. - person anre; 23.05.2016

Проверьте любые другие версии woodstox, которые можно найти в пути к классам или в lib/endorsed jre или аналогичном. Похоже, можно использовать более старую версию 4.1.

person Daniel Kulp    schedule 21.11.2013
comment
Есть только один файл woodstox-core-asl-4.2.0.jar, который я упомянул в пути к классам моего клиента, и я не могу найти ни одного файла woodstox* в каталоге lib моего JRE. - person pacoverflow; 21.11.2013

У меня была такая же проблема, когда я обновил 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>
person Vaibhav    schedule 01.02.2016

Здесь не было ответа, описывающего основную причину этого сообщения об ошибке для моей проблемы. У нас были транзитивные зависимости как от новой версии woodstox-core-asl-4.2.0.jar, так и от старой версии wstx-asl-3.2.1.jar.

Исключение старой версии из нашей сборки помогло.

Если вы покопаетесь в недрах старой версии, вы обнаружите, что она дает сбой с исключением, которое в конечном итоге превращается в другое исключение с этим общим сообщением, которое не очень информативно.

person Tom Hartwell    schedule 10.10.2015
comment
Хороший ответ! Я обнаружил эту ошибку только в нашей производительной системе и не смог воспроизвести ее локально. Прочитав ваш комментарий, я смог его воспроизвести и исправить. Спас мой день! - person Marc Hauptmann; 19.09.2017
comment
Та же война отлично работала на моей локальной машине с Windows TC Server tomcat 8, но при развертывании на машине UNIX она не удалась. Удаление старой версии wstx-asl.***.jars решило проблему. - person Vivek; 08.11.2017
comment
Мы использовали Apache CXF 3.1.10 для вызова веб-службы в приложении, работающем на JBoss 6.4. На моем локальном компьютере с Windows вызов службы работал нормально. Однако в нашей среде QA мы видели ошибку «Невозможно создать безопасный XMLInputFactory». Файл WAR имел зависимости woodstock-core-asl-4.2.0.jar и wstx-asl-3.2.9.jar в папке WEB-INF/lib. Я удалил файл wstx-asl-3.2.9.jar, и вызов веб-службы заработал как положено. Большое спасибо за ответ. - person gburgalum01; 31.10.2018

Я столкнулся с этой проблемой, потому что при обновлении старой версии cxf я не изменил stax-api-*.jar на stax2-api-*.jar в пути к классам моего клиента.

person Peter Jamieson    schedule 17.03.2014

При обновлении до 3.0.0 или более поздней версии вам не следует добавлять зависимости woodstock.

person Jad B.    schedule 18.12.2014
comment
Кажется, это неправда, откуда вы взяли эту информацию? В классе WoodstoxHelper (3.1.11) вызывают Woodstox - person user1928596; 11.05.2017

Проблема заключалась в том, что в развертывании веб-службы на сервере отсутствовали файлы JAR CXF. Это было сложно отладить, потому что на сервере не было ошибок.

person pacoverflow    schedule 22.11.2013
comment
У вас есть идеи, какие файлы CXF отсутствовали? У меня самого очень похожая проблема. - person Andrew Rueckert; 14.01.2014
comment
Догадаться; Я решил свою проблему, не исключая org.apache.cxf:cxf-bundle-jaxrs. - person Andrew Rueckert; 14.01.2014
comment
Какие файлы пропали? - person Sarel Botha; 24.03.2014

В моем случае было две банки (Cxf 3.0.1, Jboss 7.1.1)

javax.xml.stream:stax-api:jar:1.0-2:компилировать

org.codehaus.woodstox:stax2-api:jar:3.1.4:компилировать

Я удалил 1-й, и он начал работать

person Praveen    schedule 30.10.2014

с моей стороны, мне пришлось удалить как stax-api-1.0-2.jar (оставив банку stax2-api-3.1.4.jar & woodstock 4.4), так и указать в weblogic-application.xml в конце. :

     .
     .
     <package-name>com.ctc.wstx.*</package-name>  
     <package-name>org.codehaus.stax2.*</package-name>
 </prefer-application-packages>
person Carlos Guizar    schedule 20.03.2015

У меня была эта проблема в weblogic, приложение успешно развернуто, но когда я запустил мыльный запрос, я получил эту ошибку: не удается создать безопасный XMLInputFactory.

исправил проблему, добавив этот пакет в weblogic-application.xml

com.ctc.wstx.*

person Megha    schedule 07.04.2015

Я просмотрел свои зависимости, чтобы найти конфликты версий с woodstox или stax-api.

Оказывается, эти конфликты возникли из-за того, что axis2-transport-http.

Если у вас также есть эта зависимость, добавьте следующее исключение в свою зависимость от pom, которая ее представила.

<exclusions>
            <exclusion>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-transport-http</artifactId>
            </exclusion>
        </exclusions>
person Yoozzii    schedule 23.06.2015

Я могу решить эту проблему, добавив weblogic.xml в папку WEB-INF моего приложения со следующим кодом:

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

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

person Aldo Fernando Saia    schedule 28.10.2015

Интересно, что у меня была эта проблема в контейнере докеров, а не при запуске на сервере tomcat.

Проблема, с которой я столкнулся, заключалась в том, что в проекте была другая более низкая версия wstx-asl-3.2.7, и загрузчик классов, вероятно, мог сначала загрузить эту версию. Избавился от него и посчитали нужный вудстокс и проблема решилась.

person Purushothaman    schedule 18.06.2020

1: -Dorg.apache.cxf.stax.allowInsecureParser=1 в JAVA_OPTIONS
или
2: переименовать woodstox-core-asl-4.4.1.jar -> awoodstox-core-asl-4.4.1. банка

person user7240679    schedule 02.12.2016
comment
Привет, рассмотрите возможность редактирования своего ответа, чтобы добавить больше объяснений, которые могут помочь ОП и всем, кто в будущем будет бороться с подобной проблемой. - person CallumDA; 02.12.2016