here の指示に従って、CXF Webサービスを作成してTomcatサーバーにデプロイしました。 WebブラウザでWSDLファイルを確認できるため、Webサービスは正常にデプロイされます。
私のスタンドアロン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
Org.Apache.cxf.stax.allowInsecureParserプロパティを「1」に設定することで「安全なXMLInputFactoryを作成できません」という問題を修正できるというページが見つかりました。そのため、システムプロパティで設定しようとしましたが、動作しません。また、-Dorg.Apache.cxf.stax.allowInsecureParser = 1をJavaクライアントを実行するコマンドに追加しようとしましたが、どちらも機能しませんでした。このエラーを解決する方法についてのアイデアはありますか?
CXF 2.3.xから2.7.xにアップグレードするときにこの問題が発生しました
2.7.x CXFディストリビューションからstax2-apiおよびwoodstox-core-asl jarを追加し、Webサービスが再び機能するようになりました。
バージョン2.7.4以降、CXFはXMLInputFactoryが保護され、woodstox(> = 4.2.xパッケージ、 StaxUtil実装 を参照)からロードされることを保証するための機能を追加しました- サービス拒否の脆弱性
ただし、J2EE環境では、デフォルトで、webservices-rt.jar
がwar libs(およびwoodstock jar)よりも優先されます。そのため、非セキュアな実装がロードされ、例外がトリガーされます。
Org.Apache.cxf.stax.allowInsecureParserプロパティをオフにすると、はDOSの脆弱性を取り戻すため、オプションではありません。
クラスローダーがwebservices-rt.jar
(j2ee lib)よりもwoodstox
(ear/war lib)を優先するようにするため、ソリューションはアプリケーションサーバーに依存し、 CXFアプリケーションサーバー特定の構成ガイド
同様の問題がありました
これを追加した後-Dorg.Apache.cxf.stax.allowInsecureParser=1
からJava_OPTIONS
in setDomainEnv.sh
、今は問題なく動作しています。
私はweblogicでこの問題を抱えていて、これをweblogic-application.xmlに追加して問題を修正しました
<prefer-application-packages>
<package-name>com.ctc.wstx.*</package-name>
</prefer-application-packages>
クラスパスまたはjreのlib/endorsedまたは同様のもので見つかる他のバージョンのwoodstoxを確認してください。古い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の両方に推移的な依存関係がありました
私たちのビルドから古いバージョンを除外することは、トリックをしました。
古いバージョンの腸を掘り下げると、非常に有益ではないこの一般的なメッセージで別の例外にラップされる例外で失敗することがわかります。
この問題に遭遇したのは、古いバージョンのcxfからアップグレードしたときに、クライアントクラスパスでstax-api-*。jarをstax2-api-*。jarに変更しなかったためです。
3.0.0以降にアップグレードする場合、should n't add woodstock依存関係
私の場合、2つのjarがありました(Cxf 3.0.1、Jboss 7.1.1)
javax.xml.stream:stax-api:jar:1.0-2:compile
org.codehaus.woodstox:stax2-api:jar:3.1.4:compile
私は最初のものを削除し、それが動作し始めました
私の最後から、stax-api-1.0-2.jarを削除し(stax2-api-3.1.4.jarとwoodstock 4.4 jarを残して)、最後にweblogic-application.xmlで指定する必要がありました。 :
.
.
<package-name>com.ctc.wstx.*</package-name>
<package-name>org.codehaus.stax2.*</package-name>
</prefer-application-packages>
問題は、サーバー上のWebサービスのデプロイメントでCXF jarファイルが欠落していたことです。サーバーにエラーがなかったため、これはデバッグが困難でした。
依存関係を調べて、woodstoxまたはstax-apiとのバージョンの競合を見つけました。
Axis2-transport-httpがこれらの競合を引き起こしたことがわかりました。
この依存関係がある場合は、それを導入したpom依存関係に次の除外を追加してください
<exclusions>
<exclusion>
<groupId>org.Apache.axis2</groupId>
<artifactId>axis2-transport-http</artifactId>
</exclusion>
</exclusions>
この問題を解決するには、次のコードでアプリの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>
私はweblogicでこの問題を抱えていましたが、アプリケーションが正常にデプロイされましたが、soap-requestを起動したときにこの障害が発生しました:安全なXMLInputFactoryを作成できません。
このパッケージをweblogic-application.xmlに追加して問題を修正
com.ctc.wstx。*