我在网上看到过这个问题,但仍未找到一个对我有用的明确解决方案。这是问题所在:
我正在尝试用Java创建一个Web服务客户端。客户端需要是一个控制台应用程序,它将放置在服务器上并以特定时间间隔自动运行。我试图使用的Web服务是由第三方公司编写并托管的。该服务是用ASP.NET编写的。有问题的公司有几项服务。所有这些都是用ASP.NET编写的。直到2天前,我才负责处理这些服务,当时我的任务是使用2个服务并从数据中构建Excel电子表格。在继续之前,让我描述一下我的开发环境。其中一些是相关的,一些不是,但我想包括所有内容:
关于问题。当我将第一个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。它说我需要在使用之前初始化对象。
我已经研究过这个网站上似乎无限量的主题,寻找和尝试已经提供的任何解决方案。我也尝试过来自整个网络的解决方案,都没有运气。如果有人对我有任何建议,任何提示,技巧,黑客,请告诉我。我现在对任何建议持开放态度。
提前感谢您提供的任何帮助。
答案 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.xsd
,XMLSchema.dtd
和datatypes.dtd
。从中生成Java类型可能需要摆弄JAXB绑定配置。
或者,使用dynamic JAX-WS client code可能更容易。您可以使用soapUI之类的工具来创建/测试示例XML请求。
如果您决定编辑WSDL,生成的服务代码应该具有Foo_Service(URL, QName)
形式的构造函数,允许您在本地配置WSDL(例如,从类路径中)。