Java 从JAX-WS生成的代码访问web服务时,如何指定主机和端口?

Java 从JAX-WS生成的代码访问web服务时,如何指定主机和端口?,java,web-services,jax-ws,Java,Web Services,Jax Ws,我有一个web服务的WSDL文件。我正在使用JAX-WS/wsimport生成web服务的客户机接口。我无法提前知道web服务将在哪个主机上运行,我几乎可以保证它不会运行。如何在运行时(例如从命令行参数)指定主机URL 生成的构造函数MyService(URL-wsdlLocation,QName-serviceName)看起来不像我想要的,但可能是?可能是Service.getPort(…)的变体之一 谢谢 构造函数应该能够满足您的需要,当您创建MyService时,将您想要的WSDL的url

我有一个web服务的WSDL文件。我正在使用JAX-WS/wsimport生成web服务的客户机接口。我无法提前知道web服务将在哪个主机上运行,我几乎可以保证它不会运行。如何在运行时(例如从命令行参数)指定主机URL

生成的构造函数
MyService(URL-wsdlLocation,QName-serviceName)
看起来不像我想要的,但可能是?可能是
Service.getPort(…)
的变体之一


谢谢

构造函数应该能够满足您的需要,当您创建MyService时,将您想要的WSDL的url传递给它,即..

如果您查看生成的源代码,靠近生成的构造函数,您应该能够从默认构造函数中找出要放入的内容,应该类似于:

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);
}
调用Webservice:现在在实例化此对象的客户端调用中,将Webservice 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。

Ok。只是让我明白。。。MyService将请求WSDL,然后使用标记中的任何内容来确定服务的实际位置?我认为这是正确的,我已经尝试查找它,但我找不到任何明确的答案。是的。JAX-WS将在wsdlLocation加载WSDL,然后分别为serviceName和portName指定的服务和端口解析WSDL。JAX-WS在调用Web服务时将使用WSDL端口中指定的URL。因此,您需要知道WSDL URL、服务QName和端口QName,以便使用上面列出的代码与远程服务交互。