我的一个关键要求是能够在不重新编译的情况下切换服务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这是愚蠢的不太优化.