我在创建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 Service时遇到异常。 但是:我用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
有人可以帮助我吗?
答案 0 :(得分:4)
我遇到了这个错误,发现它似乎是由于使用了一个直接返回HTTP 302重定向而不是WSDL的URL。
我使用的网址格式为/Service?wsdl
,其格式为/Service/wsdl/Service.wsdl
重定向到网址。一旦我直接使用重定向目标网址,一切正常。
答案 1 :(得分:3)
我记得读过它可能与期望尾随'/'的端点有关。我不确定这是否有效,但请尝试并在此处发布,如果有效。
答案 2 :(得分:2)
我遇到了类似的错误,当我检查服务器日志时 - 它与http服务器在请求中遇到不支持的http方法有关。由于这个teh服务器返回SOAP客户端无法处理的HTTP响应...因此prolog中出现意外的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请求
答案 3 :(得分:1)
我遇到了类似的错误,当我检查服务器日志时 - 它与http服务器在请求中遇到不支持的http方法有关,返回SOAP客户端无法处理的HTTP响应...检查您的Web服务器日志< / p>
答案 4 :(得分:1)
我有类似的问题,并且已经通过调试解决了。 当我尝试在运行时下载WSDL时,我发现由于代理原因无法获取WSDL。 请检查您是否可以在运行时像以下代码一样访问WSDL:
try {
String wsdl = IOUtils.toString(new URL("http://YOUR_WSDL_URL"));
System.out.println("WSDL => "+wsdl);
} catch (IOException e) {
e.printStackTrace();
}
答案 5 :(得分:0)
其中一项进口缺失。请检查xsd的路线。
答案 6 :(得分:0)
当然,这不是由于字符或格式问题造成的。 服务器可能没有返回任何数据,Woodstox(wstx)试图将其解析为XML并失败,这导致了这个错误。
答案 7 :(得分:0)
我遇到了同样的问题。我必须使用WSDL文件的完整路径才能使其正常工作。
答案 8 :(得分:0)
我对此错误的贡献是:
在调试模式下,我没有收到此错误。
看来,当查询WSDL服务的Java程序的执行者(在我的情况下为Java)有时间执行许多请求时(例如在调试模式下),因为有时由于我放置了一些断点而导致程序停止运行,在这种情况下,我不会收到此错误。
当我在生产模式下运行程序时,是的。
但是请求是相同的,WSDL不变,端点也一样。
我认为这就像对Web服务器的限制。