Клиент веб-службы 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, которая запускает клиент, но это тоже не сработало. (И при этом не устанавливали это в "истину" вместо 1.) Есть какие-нибудь идеи о том, как решить эту ошибку?

16 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

Исключая старую версию из нашей сборки сделали свое дело.

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

Если вы обновляетесь до 3.0.0 или новее, вы не должны добавлять зависимости woodstock

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

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

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

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

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

org.codehaus.woodstox: stax2-апи: баночка:3.1.4: составить

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

Я могу решить эту проблему, добавив 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>

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

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

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

com.ctc.wstx. *

С моей стороны мне нужно было как удалить stax-api-1.0-2.jar (оставляя 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>

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

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

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

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

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

Другие вопросы по тегам