16

我在创建 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 位置和服务类名称,在我使用原始代码的代码中。)

但是,当我调用部署在应用服务器上的 Web 服务时,使用 new Service() 命令创建服务时出现异常。但是:我已经使用 SOAP UI 测试了 wsdl 位置,它运行良好。另外,我使用 Soap UI 创建了一个模拟服务,我的 Java 客户端可以连接到它,调用它并返回结果。当我想调用在应用服务器上运行的 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

有人可以帮我吗?

4

9 回答 9

14

我遇到了这个错误,发现它似乎是由于使用了返回 HTTP 302 重定向的 URL 而不是直接返回 WSDL。

我使用的 URL 是格式/Service?wsdl,它重定向到格式中的 URL /Service/wsdl/Service.wsdl。一旦我直接使用重定向目标 URL,一切正常。

于 2015-07-20T18:46:30.693 回答
3

我记得读过它可能与期望尾随'/'的端点有关。我不确定这是否有效,但如果可行,请尝试并在此处发布。

于 2014-01-09T08:06:41.533 回答
2

我遇到了类似的错误,当我检查服务器日志时 - 它与 http 服务器在请求中遇到不支持的 http 方法有关。由于这个服务器返回一个 SOAP 客户端无法处理的 HTTP 响应......因此序言中出现意外的 EOF 下面是我的 tomcat“localhost.XXXX.log”的 Web 服务器日志片段

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 请求

于 2014-01-15T10:37:17.927 回答
1

我有一个类似的错误,当我检查服务器日志时 - 它与 http 服务器有关,在请求中遇到不受支持的 http 方法返回 SOAP 客户端无法处理的 HTTP 响应......检查您的网络服务器日志

于 2014-01-15T10:29:29.453 回答
1

我有类似的问题,我已经通过调试解决了。当我尝试在运行时下载 WSDL 时,我发现由于代理,我无法获取 WSDL。请检查您是否可以像以下代码一样在运行时访问 WSDL:

  try {
      String wsdl = org.apache.commons.io.IOUtils.toString(new URL("http://YOUR_WSDL_URL"));
      System.out.println("WSDL => "+wsdl);
  } catch (IOException e) {
         e.printStackTrace();
  }
于 2018-08-28T11:30:21.990 回答
1

当然,这不是由于字符或格式问题。服务器可能没有返回任何数据,Woodstox (wstx) 试图将其解析为 XML 并失败,从而导致此错误。

于 2016-05-18T09:11:43.260 回答
0

其中一个进口货物丢失。请检查您的 xsd 的路线。

于 2015-12-01T11:08:07.137 回答
0

我对这个错误的贡献是:

当我处于调试模式时,我没有收到此错误。

似乎当查询 WSDL 服务(在我的情况下为 Java)的 Java 程序的执行程序有时间执行许多请求时,例如在调试模式下,因为有时程序会因为我放置一些断点而停止,在这种情况下我没有收到此错误。

当我在生产模式下运行程序时,是的。

但是请求是一样的,WSDL 没有改变,端点也一样。

我认为这就像网络服务器的限制。

于 2019-03-26T12:22:27.603 回答
0

I had the same problem. I had to use the full path to the WSDL file to make it works.

于 2017-01-25T23:25:11.593 回答