【问题标题】:Errors when creating a Web service client in Java在 Java 中创建 Web 服务客户端时出错
【发布时间】:2011-05-04 19:51:16
【问题描述】:

我在整个网络上都看到过这个问题,但仍然没有找到适合我的明确解决方案。问题来了:

我正在尝试用 Java 创建一个 Web 服务客户端。客户端需要是一个控制台应用程序,它将被放置在服务器上并以一定的时间间隔自动运行。我尝试使用的 Web 服务是由第三方公司编写并托管的。该服务是用 ASP.NET 编写的。有问题的公司有几项我们击中的服务。它们都是用 ASP.NET 编写的。直到 2 天前,我负责使用其中的 2 个服务并从数据中构建 Excel 电子表格,我才处理过这些服务。在继续之前,让我描述一下我的开发环境。有些是相关的,有些不是,但我想包括所有内容:

  • Windows 7 专业版 32 位
  • NetBeans IDE 6.9.1
  • Java JDK 1.6.0_17
  • jre6
  • Glassfish 3 开源全平台发布
  • 所有软件均已应用所有可用更新

解决问题。当我将第一个 Web 服务客户端添加到我的控制台应用程序时,我对这个过程的顺利进行感到惊讶。我编写 Web 服务应用程序的大部分经验都在 .NET 中。我能够在第一次尝试时导入 WSDL 和 NetBeans 生成的所有类。在 5 分钟内,我能够第一次调用该服务并收到预期的响应,让我知道我的尝试成功了。然后,我使用所需的第二个 WSDL 的地址将第二个 Web 服务客户端添加到控制台应用程序。这是我遇到了一个主要问题的地方。

在导入 WSDL 时,NetBeans 向我发出警告,指出错误:

JAXWS:wsimport 实用程序无法创建 Web 服务客户端。
原因:未定义的元素声明's:schema'

在接下来的一个小时里滥用 Google 寻找解决方案后,我最终决定进行一些试验和错误。查看 NetBeans 中的输出窗口,我可以看到它在抱怨 3 个特定的行。看了一下 WSDL,我发现这 3 行是完全一样的,如下:

<s:element ref="s:schema" />

这 3 行是在从 WSDL 顶部到大约一半的随机位置找到的。我从 Web Service References 文件夹中的 WSDL 中删除了这些行,只将 WSDL 留在 META-INF 文件夹中。然后我刷新了服务引用,令我惊讶的是,NetBeans 解析了 WSDL 并像以前一样生成了我的类。太好了,对吧?好吧,这就是问题 #2 发挥作用的地方。

现在我能够毫无错误地编译我的应用程序,我不得不尝试点击该服务以查看我的 hack 是否有效。它没有。由于 JAXWS 中的另一个错误,我必须在创建服务对象时在构造函数中提供指向 WSDL 的 URL。这意味着我修复的 WSDL 将被忽略,服务现在重新使用无法解析的 WSDL。当我尝试提供我在项目中本地编辑的 WSDL 的位置时,我收到了另一个编译错误,指出我有 NullPointerException。它说我需要在使用它之前初始化对象。

我研究了这个网站上似乎无穷无尽的主题,以寻找并尝试提供的任何解决方案。我还尝试了来自整个网络的解决方案,但都没有运气。如果有人对我有任何建议,任何提示,技巧,黑客,请告诉我。在这一点上,我愿意接受任何建议。

提前感谢您提供的任何帮助。

【问题讨论】:

标签: java asp.net service jax-ws


【解决方案1】:

单方面的合同变更可能会导致问题。

假设 s 前缀引用 http://www.w3.org/2001/XMLSchema 命名空间,看起来您的 WSDL 引用 XML 模式类型。在生成 JAXB 绑定时,JAX-WS 可能无法解决此问题。

你可以从http://www.w3.org/2001/XMLSchema.html下载XSD;您至少需要XMLSchema.xsdXMLSchema.dtddatatypes.dtd。从中生成 Java 类型可能需要摆弄您的 JAXB 绑定配置。

或者,使用dynamic JAX-WS client code 可能更容易。您可以使用soapUI 之类的工具来创建/测试示例XML 请求。


如果您决定编辑 WSDL,则生成的服务代码应该有一个 Foo_Service(URL, QName) 形式的构造函数,允许您在本地(例如从您的类路径)提供 WSDL。

【讨论】:

    【解决方案2】:

    我要做的第一件事是尝试在一个用于测试 SOAP 服务的工具中打开它,比如 SoapUI。如果您的架构无法解析,则可能会有一些您可能需要的代码也不会生成。我最近与供应商提供的“网络服务”发生了这种情况,经过多次伪装后,他们“奇迹般地”找到了一组可以正常工作的替代服务。

    您也可以尝试一些 Jax-W 的替代方案,例如 CXF 或 Axis。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多