java – 使用wsimport生成的webservice客户端更改URL

我正在为一个访问WSDL描述的Web服务的 Java应用程序编写一个模块.源WSDL直接从我认为是ASP.NET Web服务下载;服务网址以.asmx扩展名结尾,并且在浏览器中查看服务URL显示可用于下载WSDL的链接.

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

但是我的想法似乎并没有与wsimport工具正在为我做些什么.遵循f1sh的答案here,我使用以下命令从我下载的WSDL生成Java代码

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

我发现生成代码对我下载的wsdlFile.wsdl(包含服务URL)有硬编码引用.我们的应用程序不会以通过在运行时编辑WSDL文件进行配置的方式运行.我需要在构建时将代码编译到我的应用程序中,并且可以在实例化时设置服务URL.

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

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

解决方法

This approach requires me to also supply a javax.xml.namespace.QName object,which I don’t yet understand,as the second argument.

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

I still don’t understand why the WSDL is needed at runtime.

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

我始终使用生成的服务中的双参数构造函数,通过ClassLoader.getResource方法提供一个URL,将WSDL嵌入到我的jar中.与任何模式一样,使用远程或文件系统URL这是愚蠢的不太优化.

this question for how to set the end-point at runtime.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...