使用wsimport生成的webservice客户端如何更改URL

13

我正在尝试编写一个模块,用于访问描述为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构建客户端代码?
2个回答

10

这个问题困扰了我几天,但是写下这个问题似乎总能让我集中精力找到答案,再做几次网络搜索后终于找到了:

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 生成我的代码吗?


8

这种方法需要我提供一个javax.xml.namespace.QName对象作为第二个参数,但我还不理解它的含义。

复制您生成的源代码中的QName。QName是XML 合格名称-一种“独特”的身份标识。

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

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

我总是使用生成服务中的两个参数构造函数,通过ClassLoader.getResource方法提供URL来将WSDL嵌入我的jar文件中。与任何模式一样,使用远程或文件系统URL并不是最优解。

请查看如何在运行时设置端点的问题:

HelloService service = new HelloService();
Hello port = service.getHelloPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
      "http://foo:8086/HelloWhatever");
String response = port.sayHello(name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接