Web服务器生成格式错误的services.wsdl

时间:2012-03-19 15:21:44

标签: java web-services tomcat wsdl cxf

我有一个Tomcat 7.0 Web服务器,我用它来运行Web服务。 Web服务框架是CXF 2.5.2。

从Eclipse Web Service Explorer测试Web服务时,一切都按预期工作。但是,当从WSDL(使用Eclipse)生成Java Client并运行它时,从Service实现中调用super(wsdlLocation, serviceName)时会出现以下错误:

Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:150)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:91)
at javax.xml.ws.Service.<init>(Service.java:77)
at test.Test_Service.<init>(Test_Service.java:43)
at test.Test_TestSOAP_Client.main(Test_TestSOAP_Client.java:47)

Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:94)
at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:204)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:148)
... 4 more

Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'c' (code 99) in start tag Expected a quote at [row,col,system-id]: [1,208,"http://www.example.com:8081/TestWS/services?wsdl"]
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:240)
at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:191)
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)
... 6 more

Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'c' (code 99) in start tag Expected a quote at [row,col,system-id]: [1,208,"http://www.example.com:8081/TestWS/services?wsdl"]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:639)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:3005)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2926)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2802)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1050)
at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:1080)
at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:974)
at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:901)
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:231)
... 8 more

有趣的部分应该是Unexpected character 'c' (code 99) in start tag Expected a quote at [row,col,system-id]: [1,208,"http://www.example.com:8081/TestWS/services?wsdl"]消息。在检查生成的services.wsdl时,我发现问题出在meta部分:

<meta http-equiv=content-type content="text/html; charset=UTF-8">

content-type通常应包含在引号中。这是一个已使用的框架/服务器中的已知错误吗?我该怎么做才能解决这个问题?为什么使用Eclipse Web Services Explorer时没有问题?它是否更容错(因为我的Firefox似乎是因为它也没有任何问题来显示生成的wsdl的图形表示)。

4 个答案:

答案 0 :(得分:3)

服务列表页面是一个HTML页面,列出了服务并提供了指向这些服务的相应WSDL文档的链接(或基于其余服务的WADL文档)。它不是WSDL文档。将其解析为WSDL是行不通的。

答案 1 :(得分:1)

这看起来像是CXF服务列表生成的问题/错误。在org.apache.cxf.transport.servlet.servicelist.FormattedServiceListWriter来源(第52行):

    writer.write("<meta http-equiv=content-type content=\"text/html; charset=UTF-8\">");

即。 http-equiv值未加引号。因此,其他工具没有问题,因为它们更具“容错性” - 正如您所猜测的那样。

我不确定com.ctc.wstx.*类是什么,因为看起来这是验证发生的地方并且抛出了错误。如果它是你可以控制的东西,(临时)解决方法可能是在服务列表页面上运行HTMLTidy吗?

值得一提的是CXF邮件列表或提出错误?

答案 2 :(得分:1)

发现问题。我不小心将WSDL端点指定为http://www.example.com:8081/TestWS/services而不是http://www.example.com:8081/TestWS/services/MyTestWS。因此,自动生成的客户端尝试从http://www.example.com:8081/TestWS/services?wsdl获取WSDL,它返回一个HTML页面,而不是返回实际WSDL的http://www.example.com:8081/TestWS/services/MyTestWS?wsdl

答案 3 :(得分:0)

我有一次同样的异常,因为在一个地方的配置文件中我错过了双引号..例如destination-name=closeTaskService

修复是destination-name="closeTaskService",错误是下面的一些事情 开始标记中的org.jboss.deployment.DeploymentException: Unexpected character 'c' (code 99)预期引用