使用Java创建Web服务客户端时出错

时间:2011-05-04 19:51:17

标签: java asp.net service jax-ws

我在网上看到过这个问题,但仍未找到一个对我有用的明确解决方案。这是问题所在:

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

  • Windows 7 Professional 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无法创建Web服务客户端:wsimport实用程序   原因:未定义的元素声明:schema'

在下一个小时滥用谷歌寻找解决方案之后,我最终决定应用一些试验和错误。查看NetBeans中的“输出”窗口,我可以看到它抱怨了3条特定的行。一旦我看了WSDL,我就可以看到这3行完全相同,如下所示:

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

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

现在我能够编译我的应用程序没有错误,我不得不尝试点击服务,看看我的黑客是否有效。它没。由于JAXWS中的另一个错误,我必须在创建服务对象时在构造函数中提供WSDL的URL。这意味着我修复了我修复的WSDL,现在服务又回到了使用无法解析的WSDL。当我试图提供我在项目中本地编辑的WSDL的位置时,我遇到了另一个编译错误,说明我有一个NullPointerException。它说我需要在使用之前初始化对象。

我已经研究过这个网站上似乎无限量的主题,寻找和尝试已经提供的任何解决方案。我也尝试过来自整个网络的解决方案,都没有运气。如果有人对我有任何建议,任何提示,技巧,黑客,请告诉我。我现在对任何建议持开放态度。

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

2 个答案:

答案 0 :(得分:0)

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

你也可以尝试一些Jax-Ws的替代品,比如CXF或Axis。

答案 1 :(得分:0)

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

假设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(例如,从类路径中)。