Веб-сервер генерирует плохо отформатированные сервисы. Wsdl - PullRequest
3 голосов
/ 19 марта 2012

У меня есть веб-сервер Tomcat 7.0, который я использую для запуска веб-службы на нем. Платформа веб-службы - CXF 2.5.2.

При тестировании веб-сервиса из Eclipse Web Service Explorer все работает как положено. Однако при генерации Java-клиента из WSDL (с использованием Eclipse) и его запуске я получаю следующую ошибку при вызове 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 http-equiv=content-type content="text/html; charset=UTF-8">

content-type обычно следует заключать в кавычки. Это известная ошибка в одном из используемых фреймворков / серверов? Что я могу сделать, чтобы обойти это? И почему нет проблем при использовании Eclipse Web Services Explorer? Является ли он более отказоустойчивым (поскольку мой Firefox, кажется, так же не имеет проблем с отображением графического представления сгенерированного wsdl).

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Страница списка сервисов - это HTML-страница, на которой перечислены сервисы и приведены ссылки на соответствующие документы WSDL для этих сервисов (или документы WADL для остальных сервисов).Это не документ WSDL.Разбор его как WSDL не сработает.

1 голос
/ 21 марта 2012

Нашел проблему.Я случайно указал конечную точку WSDL как http://www.example.com:8081/TestWS/services вместо http://www.example.com:8081/TestWS/services/MyTestWS.Таким образом, автоматически сгенерированный клиент попытался извлечь WSDL из http://www.example.com:8081/TestWS/services?wsdl, который возвращает HTML-страницу, вместо http://www.example.com:8081/TestWS/services/MyTestWS?wsdl, который возвращает фактический WSDL.

1 голос
/ 20 марта 2012

Это похоже на проблему / ошибку при создании списка сервисов 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 или поднять ошибку?

0 голосов
/ 20 июля 2015

У меня было то же исключение один раз, и это было потому, что в конфигурационном файле в одном месте мне не хватало двойных кавычек .. пример destination-name=closeTaskService

исправление было destination-name="closeTaskService", ошибка была похожа на приведенную ниже org.jboss.deployment.DeploymentException: Unexpected character 'c' (code 99) в стартовом теге Ожидается цитата

...