繁体   English   中英

在 Java 中创建 Web 服务客户端时出错

[英]Errors when creating a Web service client in Java

我已经在 Web 上看到了这个问题,但仍然没有找到适合我的明确解决方案。 这是问题:

我正在尝试在 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'

在接下来的一个小时里滥用谷歌寻找解决方案后,我最终决定应用一些试验和错误。 查看 NetBeans 中的 Output window ,我可以看到它在抱怨 3 个特定的行。 当我查看 WSDL 时,我可以看到这 3 行完全相同,如下所示:

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

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

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

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

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

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

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

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

假设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 绑定配置。

或者,只使用动态 JAX-WS 客户端代码可能更容易。 您可以使用诸如 soapUI 之类的工具来创建/测试示例 XML 请求。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM