2010-08-25 172 views
10

我正在尝试为访问WSDL描述的webservice的Java应用程序编写一个模块。源WSDL直接从我认为是ASP.NET web服务的地方下载;服务URL以.asmx扩展名结尾,并且在浏览器中查看服务URL会显示可用于下载WSDL的链接。更改使用wsimport生成的webservice客户端上的URL

对我来说一个关键的要求是能够在不重新编译的情况下切换服务URL。给我的URL显然是一个测试服务器,我知道在生产中我会得到一个生产URL来使用。我也希望能够自己创建一个模拟服务器进行测试,并保留在将来指定新URL的能力,而不必重新编译服务是否被移动。实际上,我希望安装我们的应用程序,以便能够在不同的URL处实例化多个 web服务实例。

但我的构想似乎并不符合wsimport工具为我做的事情。继f1sh的回答here,我生成的Java代码从我下载的WSDL用这个命令:

wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl 

我发现的是,生成的代码有一个硬编码引用我的下载wsdlFile.wsdl,其中包含服务的URL。我们的应用程序不会以运行时编辑WSDL文件的方式运行。我需要在编译时编译到我的应用程序中的代码,并且可以在实例化时设置服务URL。

我不完全确定为什么WSDL甚至需要在运行时解析;我的理解是WSDL提供了足够的信息来生成可以访问web服务的代码,所以我不确定它提供给生成的代码而不是服务URL,我不确定服务URL为什么不提供一个构造函数或通过生成的webservice类中的方法进行配置。我肯定错过了什么。

这种情况下的一般做法是什么?大多数人是否重新生成将要使用的每个URL的代码?代码是否在运行时生成?是否有另一个WSDL工具可以用来构建带有可配置URL的客户端代码?

回答

3

这种方法要求我还提供一个javax.xml.namespace.QName对象,我还不明白它作为第二个参数。

从您生成的源中复制一个。 A QName是XML qualified name - “唯一”身份。

我仍然不明白为什么在运行时需要WSDL。

我不能说我确实知道,但WSDL基本上是一个模式。通过提供它,我猜你给了JAX-WS一个验证SOAP响应的机制。我不认为JAXB绑定足以做到这一点。

我总是在生成的服务中使用双参数构造函数,通过方法提供一个URL,以将WSDL嵌入到我的jar中。与任何模式一样,为此使用远程或文件系统URL是 愚蠢 不是最优。

请参阅this question for how to set the end-point at runtime

10

这个答案一直躲避我几天,但不知何故,书写问题的行为始终专注我在寻找一个答案,和一对夫妇更websearches已经指出了它:

http://www.fransvanbuul.net/?p=98

似乎wsimport创建了一个类,com.example.WebService,它扩展了javax.xml.ws.Service。这个WebService类有两个构造函数。无参数构造函数使用file:// URL来硬编码,以使用我生成的原始WSDL。 (我想,如果我在wsimport命令行上提供了https:// URL,那将是硬编码的URL。)或者,我可以使用双参数构造函数并在实例化时提供WSDL URL!这种方法要求我还提供一个javax.xml.namespace.QName对象,我还不明白它作为第二个参数。

使用这个两个参数的构造函数可能会解决我的问题。

似乎我从JDK 1.6中使用的wsimport是JAX-WS软件包的一部分。在最近的版本中,JDK 1.6包含JAX-WS 2.1,而JAX-WS 2.2将解决我在这个问题中遇到的困难。

我很乐意接受任何解释部分或全部其他情况的答案。我仍然不明白为什么在运行时需要WSDL。更实际一点,它会帮助我向某人展示如何使用双参数构造函数,或者如何使用JDK 1.6和JAX-WS 2.2生成我的代码。

相关问题