【问题标题】:org.xml.sax.SAXParseException while initializing JAXWS consumerorg.xml.sax.SAXParseException 在初始化 JAXWS 消费者时
【发布时间】:2017-10-24 14:00:06
【问题描述】:

当调用 JAXWS Java 消费者存根构造函数时,我收到以下异常。当我尝试通过。 SOAPUI 一切正常并且能够得到正确的响应。它是多个应用程序服务器(Websphere 7.x 集群)设置的 Web 服务器。消费者代码看起来不错。提供程序代码很好,因为它在 SOAPUI 中工作。 Web 服务器存在一些问题,Web 服务器可能会以 HTML 而不是 XML 响应。通过 Java 使用者尝试时,App Server 未收到请求,并且没有日志。我们在没有设置 Web 服务器的本地应用程序服务器中进行了测试,它可以工作。不知道问题出在哪里?有人可以帮忙吗?我正在使用 WebSphere 附带的 Axis2 来托管 Web 服务。 Web Sphere 读取实现类中的注解来部署 Web 服务。自动生成 WSDL。 WSDL 位置我没有在实现文件中指定,如果它指定不起作用。我没有提供配置文件(web.xml 等)。它不是 HTTPS 网络服务。我可以远程登录到 Web 服务服务器并通过远程登录获取 WSDL。

javax.xml.ws.WebServiceException: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'http://ip:port/AppName/ServiceName'.: (http://ip:port/AppName/ServiceName%27.:) org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
at org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:175)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70)
at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:128)
at org.apache.axis2.jaxws.util.WSDL4JWrapper.loadDefinition(WSDL4JWrapper.java:754)
at org.apache.axis2.jaxws.util.WSDL4JWrapper.getDefinition(WSDL4JWrapper.java:670)
at org.apache.axis2.jaxws.util.WSDL4JWrapper.commonPartsURLConstructor(WSDL4JWrapper.java:224)
at org.apache.axis2.jaxws.util.WSDL4JWrapper.<init>(WSDL4JWrapper.java:156)
at org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.setupWsdlDefinition(ServiceDescriptionImpl.java:1191)
at org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.<init>(ServiceDescriptionImpl.java:245)
at org.apache.axis2.jaxws.description.impl.ServiceDescriptionImpl.<init>(ServiceDescriptionImpl.java:168)
at org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:142)
at org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl.createServiceDescription(DescriptionFactoryImpl.java:79)
at org.apache.axis2.jaxws.description.DescriptionFactory.createServiceDescription(DescriptionFactory.java:76)
at org.apache.axis2.jaxws.spi.ServiceDelegate.<init>(ServiceDelegate.java:212)
at org.apache.axis2.jaxws.spi.Provider.createServiceDelegate(Provider.java:71)
at javax.xml.ws.Service.<init>(Service.java:67)
at somepackage.servicename.<init>(servicename.java:42)...more are here hidden to maintain confidential
Caused by: 
javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'http://ip:port/AppName/ServiceName'.: (http://ip:port/AppName/ServiceName%27.:) org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2315)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2390)
at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2356)
at org.apache.axis2.jaxws.util.WSDL4JWrapper$13.run(WSDL4JWrapper.java:745)
at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
at org.apache.axis2.jaxws.util.WSDL4JWrapper.loadDefinition(WSDL4JWrapper.java:742)
... 70 more
Caused by: 
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2305)
... 75 more  </pre>

【问题讨论】:

  • SOAP 服务是在 WebSphere 下运行,还是在客户端下运行,还是两者兼而有之?
  • SOAP 服务在 WebSphere Provider 端运行。消费者和提供者在单独的 WebSphere 中运行。消费者 WebSphere 是 8.x,而提供者是 7.x。我后来检查了它是应用服务器到应用服务器的交互。不是应用服务器到 Web 服务器。这是 UAT 环境。我从桌面测试到应用服务器 7.x 的那个工作正常。
  • 正如布鲁斯所说,将 WSDL 和 xsd 放在客户端有效,但不确定是否是好的方法。如果我们从服务器动态获取 WSDL 和 xsd 会更好。查看他的 cmets 了解更多详情
  • 消费者端没有运行肥皂服务
  • 您使用的 WSDL URL 是什么?它会重定向到其他东西吗?您可以粘贴引用它的客户端代理代码吗?很高兴您有解决方法,但是,像您一样,我希望尽量减少此类事情的手动活动,并且我希望了解为什么原来的方法不是'不工作。

标签: web-services websphere jax-ws


【解决方案1】:

我不确定您的 wsdl 检索出了什么问题,但是如果您可以从远程服务中提取 wsdl(以及它导入的任何文件)并直接将它们与您的客户端打包,那将避免检索 wsdl每次调用的远程服务,除了在您的情况下不起作用之外,还会降低性能。您的客户端 wsdllocation 将更改为 file:///(something)。如果您使用的是 RAD 或 WDT 等开发人员工具,它可以选择自动检索 wsdl 并将其与客户端打包。

【讨论】:

  • 它有效,但这是一个好方法吗?我使用了 jax-ws-catalog.xml 并将 wsdl 和 xsd 放在 MANIFEST-INF 目录中。 WSDL 使用 XSD 表示 XSD 正在导入另一个 XSD。
  • 如果稍后远程 wsdl 发生重大更改,客户端可能会收到一条信息较少的错误消息。但是即使 wsdl 是远程的,大多数客户端仍然会被这样的更改破坏。
  • 一个相关的方法是 wsimport 的 -clientJar 选项。 ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多