Javaクライアントを実行中のWebサービスに作成して接続するときに問題があります。
次のコードを使用します。
Service myService = null;
URL wsdlLocation = new URL("http://myservice?wsdl");
QName serviceName = new QName(wsdlLocation, "MyService");
Service myService = new Service(wsdlLocation, serviceName);
ここで、Serviceクラスは次のコマンドで作成されました。
wsimport -d gen -keep http://myservice?wsdl
また、Apache cxf 2.4のwsdl2Javaによって生成されたクライアントを試してみましたが、同じ結果が得られました。
(WSDLの場所とサービスクラス名はこの投稿でのみ変更しました。コードでは、元のものを使用しています。)
しかし、新しいService()コマンドでサービスを作成するときに、appserverにデプロイされたWebサービスを呼び出すと、例外が発生します。しかし、私はSOAP UIでwsdlの場所をテストしましたが、完全に機能します。また、Soap UIと私のJavaを使用してモックサービスを作成しましたクライアントはそれに接続して呼び出し、結果を取得できます。appserverで実行されているWebサービスを呼び出したいときに問題が発生します。
スタックトレース:
javax.xml.ws.WebServiceException: org.Apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.Apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.Java:149)
at org.Apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.Java:98)
at javax.xml.ws.Service.<init>(Service.Java:76)
at MyService.<init>(MyService.Java:42)
at mypackage.createService(AClass.Java:288)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:616)
Caused by: org.Apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.Apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.Java:100)
at org.Apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.Java:199)
at org.Apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.Java:147)
... 12 more
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
at [row,col,system-id]: [1,0,"http://myservice?wsdl"]
at org.Apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.Java:256)
at org.Apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.Java:205)
at org.Apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.Java:98)
... 14 more
Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
at [row,col,system-id]: [1,0,"http://myservice?wsdl"]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.Java:677)
at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.Java:2139)
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.Java:2045)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.Java:1134)
at org.Apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.Java:1248)
at org.Apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.Java:1142)
at org.Apache.cxf.staxutils.StaxUtils.read(StaxUtils.Java:1069)
at org.Apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.Java:247)
... 16 more
誰かが私を助けてくれませんか?
このエラーが発生し、WSDLの代わりにHTTP 302リダイレクトを返すURLを直接使用したことが原因であることがわかりました。
私が使用していたURLは/Service?wsdl
という形式でしたが、/Service/wsdl/Service.wsdl
という形式のURLにリダイレクトされました。リダイレクトターゲットURLを直接使用すると、すべてが機能しました。
末尾に「/」が必要なエンドポイントに関連している可能性があることを読んだことを覚えています。これが有効かどうかはわかりませんが、試してみて、問題がなければここに投稿してください。
同様のエラーが発生し、サーバーログを確認したところ、サポートされていないhttpメソッドがリクエストで検出されたことが原因でした。このため、サーバーはSOAPクライアントが処理できない...というHTTP応答を返します...したがって、予期しないEOFプロローグ内以下は、私のWebサーバーログの一部です。 Tomcat "localhost.XXXX.log"の場合
org.Apache.Tomcat.util.descriptor.web.SecurityConstraint.findUncoveredHttpMethods For security constraints with URL pattern [/services/*] only the HTTP methods [POST GET] are covered. All other methods are uncovered.
これにより、クライアント側で次のエラーが発生しました
com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
私の場合、私はセキュリティで保護されたサービスをセキュリティで保護されていないサービスにダウングレードし、web.xmlにGETを制限する迷子のエントリがあり、セキュリティ制約で投稿していたため、必要なセキュリティパラメータをリクエストで送信していませんでした。
<security-constraint>
<web-resource-collection>
<web-resource-name>restricted web services</web-resource-name>
<url-pattern>/services/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
このエラーを取り除くためにこの制約を削除しました:-)
あなたの場合、それはセキュリティ制約に関連していない可能性があります-それは確かに生のhttp応答を送信するサーバーに関連しています-サーバー/クライアント構成を確認し、httpサーバーが好む適切なhttpリクエストを送信することを確認してください
同様のエラーが発生し、サーバーログを確認したところ、サポートされていないhttpメソッドがリクエストで検出されたHTTPサーバーがHTTP応答を返したため、SOAPクライアントは処理できません...チェックウェブサーバーのログ
同様の問題があり、デバッグで解決しました。実行時にWSDLをダウンロードしようとすると、プロキシが原因でWSDLを取得できないことがわかりました。次のコードのように、実行時にWSDLにアクセスできることを確認してください。
try {
String wsdl = IOUtils.toString(new URL("http://YOUR_WSDL_URL"));
System.out.println("WSDL => "+wsdl);
} catch (IOException e) {
e.printStackTrace();
}
インポートの1つが欠落しています。 xsdへのルートを確認してください。
私も同じ問題を抱えていました。それを機能させるには、WSDLファイルへの完全パスを使用する必要がありました。
このエラーへの私の貢献はこれです:
デバッグモードでは、このエラーは発生しません。
Java WSDLサービスをクエリするプログラム(私の場合はJava)の実行者が、デバッグモードのように多くのリクエストを実行する時間がある場合、プログラムが停止する場合があるため、いくつかのブレークポイントを置いたので、この場合、このエラーは発生しません。
プロダクションモードでプログラムを実行すると、はい。
しかし、リクエストは同じで、WSDLは変更されず、エンドポイントも通知されません。
Webサーバーの制限のようなものだと思います。
確かに、これは文字や形式の問題が原因ではありません。サーバーがデータを返さなかった可能性があります。Woodstox(wstx)がXMLに解析しようとして失敗したため、このエラーが発生しました。