我有一个用于 Web 服务的 WSDL 文件。我正在使用 JAX-WS/wsimport 生成 Web 服务的客户端接口。我不提前知道 Web 服务将在哪个主机上运行,我几乎可以保证它不会是http://localhost:8080。如何在运行时指定主机 URL,例如从命令行参数?
生成的构造函数MyService(URL wsdlLocation, QName serviceName)
似乎不是我想要的,但也许是?也许是的变体之一Service.getPort(...)
?
谢谢!
我有一个用于 Web 服务的 WSDL 文件。我正在使用 JAX-WS/wsimport 生成 Web 服务的客户端接口。我不提前知道 Web 服务将在哪个主机上运行,我几乎可以保证它不会是http://localhost:8080。如何在运行时指定主机 URL,例如从命令行参数?
生成的构造函数MyService(URL wsdlLocation, QName serviceName)
似乎不是我想要的,但也许是?也许是的变体之一Service.getPort(...)
?
谢谢!
构造函数应该可以满足您的需要,当您创建 MyService 时,将您想要的 WSDL 的 url 传递给它,即http://someurl:someport/service?wsdl。
如果您在生成的构造函数附近查看生成的源代码,您应该能够从默认构造函数中找出要放入其中的内容,应该类似于:
public OrdersService() {
super(WSDL_LOCATION, new QName("http://namespace.org/order/v1", "OrdersService"));
}
您应该能够在类中更靠前的静态字段中找到 WSDL_LOCATION 的定义。
在您生成的代码中(例如:说“HelloWorldWebServiceImplService”)查看顶部的静态块,该块将引用 META-INF 下的 WSDL url 或 wsdl 文件。
/*
static {
URL url = null;
try {
url = new URL("http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(HelloWorldWebServiceImplService.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl");
}
WSDL_LOCATION = url;
}
*/
一旦您对此发表评论,您还需要注释掉默认构造函数,并且不用说初始化静态 WSDL_LOCATION = null; (为空)所以你不会有两个构造函数,如下所示。
public final static URL WSDL_LOCATION = null;
public HelloWorldWebServiceImplService(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
}
public HelloWorldWebServiceImplService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
调用 Web 服务:现在在实例化此对象的客户端调用中,将 Web 服务 URL 作为参数传递,如图所示
//You can read mywebserviceURL from property file as String.
String mywebserviceURL = "http://myqamachine.com/HelloWorld/HelloWorldWebServiceImpl?wsdl"
URL WsURL = new URL(mywebserviceURL);
HelloWorldWebServiceImplService webService = new HelloWorldWebServiceImplService(WsURL);
所以在这里你可以动态地指向 webservice url。