2011-05-04 115 views
3

我在整个Web上都看到过这个问题,但仍未找到适用于我的明确解决方案。这里的问题:在Java中创建Web服务客户端时的错误

我想在Java中创建一个Web服务客户端。客户端需要是一个控制台应用程序,它将放置在服务器上,并以特定的时间间隔自动运行。我试图使用的Web服务是由第三方公司主持编写的。该服务是用ASP.NET编写的。有问题的公司有我们碰到的几项服务。所有这些都是用ASP.NET编写的。直到两天前,我才从事这些服务的处理,当时我负责消费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 Service Client添加到控制台应用程序。这是我遇到的一个主要问题。

在导入WSDL,我被NetBeans的声明提醒的错误:

Web服务客户端无法通过JAXWS创建:wsimport的实用工具。
原因:未定义元素声明的:模式'

滥用谷歌下一个小时的寻找解决的办法,我终于决定申请一些试验和错误。查看NetBeans中的Output窗口,我可以看到它抱怨了3条特定的行。有一次,我在WSDL接过一看,我可以看到那些3线都是一模一样的,如下:

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

这3条线路在随机的地方被发现从WSDL的顶部,下降到约一半通过。我从Web服务引用文件夹中找到的WSDL中删除了这些行,将WSDL保留在META-INF文件夹中。然后我对服务参考进行了刷新,让我感到意外的是,NetBeans解析了WSDL并像以前一样生成了我的类。很好,对吧?那么,这里是#2问题的起因。

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

我研究了本网站上寻找和尝试提供任何解决方案的无限量主题。我也尝试过来自全网的解决方案,所有这些都没有运气。如果有人对我有任何建议,任何提示,技巧,黑客,请让我知道。我愿意接受任何建议。

在此先感谢您提供的任何帮助。

+0

这可能是相关的:http://weblogs.java.net/blog/vivekp/archive/2007/05/how_to_deal_wit_1.html – 2011-05-04 20:23:48

回答

0

单向契约更改可能会导致问题。

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

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

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


如果你决定编辑WSDL,生成的服务代码的形式应该为Foo_Service(URL, QName),使您可以提供的WSDL局部(例如,从你的classpath)的构造函数。

0

我要做的第一件事就是尝试在用于测试SOAP服务的其中一个工具中打开它,如SoapUI。如果你的schema没有解析,那么可能会有一些你可能需要的代码不会被生成。我最近在一家供应商提供“网络服务”时发生过这种情况,经过大量拆解后,他们“奇迹般地”发现了一套可以正常工作的替代服务。

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