我正在尝试为访问WSDL描述的Web服务的Java应用程序编写一个模块。源WSDL直接从我认为是ASP.NET Web服务下载;服务URL以.asmx扩展名结尾,在浏览器中查看服务URL显示可用于下载WSDL的链接。
对我而言,一个关键要求是能够在不重新编译的情况下切换服务URL。给我的URL显然是一个测试服务器,我知道在生产中我将获得一个生产URL使用。我还希望能够自己创建一个模拟服务器进行测试,并保留将来指定新URL的功能,而无需重新编译服务。实际上,我希望我们的应用程序的安装能够实例化 多 不同URL的Web服务实例。
但是我的概念似乎与wsimport工具为我做的事情不相符。按照f1sh的回答 这里,我使用以下命令从我下载的WSDL生成Java代码:
wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl
我发现生成的代码具有对我下载的wsdlFile.wsdl的硬编码引用,其中包含服务URL。我们的应用程序不会以通过在运行时编辑WSDL文件来配置它的方式运行。我需要在构建时将代码编译到我的应用程序中,并且可以在实例化时设置服务URL。
我不完全确定为什么WSDL甚至需要在运行时解析;我的理解是,WSDL提供了足够的信息来生成可以访问web服务的代码,因此我不确定它为服务URL以外的生成代码提供了什么,我不确定为什么服务URL没有提供构造函数或可通过生成的Web服务类上的方法进行配置。我肯定错过了什么。
这种情况的一般做法是什么?大多数人会为他们将要使用的每个URL重新生成代码吗?代码是在运行时生成的吗?是否有另一个我可以使用的WSDL工具,它将使用可配置的URL构建客户端代码?
这种方法要求我提供一个我还不了解的javax.xml.namespace.QName对象作为第二个参数。
从生成的源中复制一个。一个 QName
是一个XML 合格的名字 - “独特”的身份。
我仍然不明白为什么在运行时需要WSDL。
我不能说我肯定知道,但WSDL基本上是一个架构。通过提供它,我猜你给JAX-WS一个机制来验证SOAP响应。我认为JAXB绑定不足以做到这一点。
我总是在生成的服务中使用双参数构造函数来提供URL ClassLoader.getResource方法, 将WSDL嵌入jar中的方法。与任何架构一样,为此使用远程或文件系统URL 笨 不太理想。
看到 这个问题是关于如何在运行时设置终点。
这个答案一直困扰着我几天,但不知怎的,写这个问题的行为总是把我集中在寻找答案上,还有几个网络搜索指出了它:
http://www.fransvanbuul.net/?p=98
似乎wsimport创建了一个类com.example.WebService,它扩展了javax.xml.ws.Service。此WebService类有两个构造函数。 no-arg构造函数使用file:// URL进行硬编码,以使用我生成的原始WSDL。 (我想如果我在wsimport命令行上提供了一个https:// URL,那就是硬编码的URL。)或者我可以使用一个双arg构造函数并在实例化时提供一个WSDL URL!这种方法要求我提供一个我还不了解的javax.xml.namespace.QName对象作为第二个参数。
使用这个两个arg构造函数可能会解决我的问题。
似乎我在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生成我的代码。