当我使用来自CXF的wsdl2java(生成类似于wsimport的东西)生成一个webservice客户端时,通过maven,我的服务从这样的代码开始:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
Run Code Online (Sandbox Code Playgroud)
硬编码的绝对路径真的很糟糕.生成的类不能在除我之外的任何其他计算机上工作.
第一个想法是将WSDL文件(以及它导入的所有内容,其他WSDL和XSD)放在jar文件和类路径中.但我们想避免这种情况.由于所有这些都是由基于WSDL和XSD的CXF和JAXB生成的,因此我们认为在运行时需要知道WSDL没有意义.
wsdlLocation属性旨在覆盖WSDL位置(至少这是我在某处获得的),默认值为"".由于我们使用maven,我们尝试<wsdlLocation></wsdlLocation>在CXF的配置中包含以尝试强制源生成器将wsdlLocation留空.但是,这只是使它忽略XML标记,因为它是空的.我们做了一个非常难看的可耻黑客,使用<wsdlLocation>" + "</wsdlLocation>. …
如何动态更改JAXWS客户端使用的地址?该客户端由wsimport生成.
我正在尝试为访问WSDL描述的Web服务的Java应用程序编写一个模块.源WSDL直接从我认为是ASP.NET Web服务下载; 服务URL以.asmx扩展名结尾,在浏览器中查看服务URL显示可用于下载WSDL的链接.
对我而言,一个关键要求是能够在不重新编译的情况下切换服务URL.给我的URL显然是一个测试服务器,我知道在生产中我将获得一个生产URL使用.我还希望能够自己创建一个模拟服务器进行测试,并保留将来指定新URL的功能,而无需在移动服务时重新编译.实际上,我希望我们的应用程序的安装能够在不同的URL 实例化web服务的多个实例.
但我的概念似乎与wsimport工具为我做的事情不相符.继f1sh的答案在这里,我生成的Java代码从我用这个命令下载WSDL:
wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl
Run Code Online (Sandbox Code Playgroud)
我发现生成的代码对我下载的wsdlFile.wsdl有一个硬编码的引用,其中包含服务URL.我们的应用程序不会以通过在运行时编辑WSDL文件来配置它的方式运行.我需要在构建时将代码编译到我的应用程序中,并且可以在实例化时设置服务URL.
我不完全确定为什么WSDL甚至需要在运行时解析; 我的理解是WSDL提供了足够的信息来生成可以访问web服务的代码,所以我不确定它为服务URL以外的生成代码提供了什么,我不知道为什么服务URL没有提供构造函数或可通过生成的Web服务类上的方法进行配置.我肯定错过了什么.
这种情况的一般做法是什么?大多数人会为他们将要使用的每个URL重新生成代码吗?代码是在运行时生成的吗?是否有另一个我可以使用的WSDL工具,它将使用可配置的URL构建客户端代码?