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

时间:2009-03-16 02:01:28

标签: java web-services jax-ws

我有一个Web服务的WSDL文件。我正在使用JAX-WS / wsimport生成Web服务的客户端接口。我不知道提前运行Web服务的主机,我几乎可以保证它不会是http://localhost:8080。如何在运行时指定主机URL,例如从命令行参数?

生成的构造函数MyService(URL wsdlLocation, QName serviceName)似乎不是我想要的,但也许它是?也许是Service.getPort(...)

的变体之一

谢谢!

3 个答案:

答案 0 :(得分:1)

构造函数应该可以满足您的需求,在创建MyService时,将它传递给您想要的WSDL的URL,即http://someurl:someport/service?wsdl

答案 1 :(得分:1)

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

public OrdersService() {
    super(WSDL_LOCATION, new QName("http://namespace.org/order/v1", "OrdersService"));
}

你应该能够在类中的静态字段中找到WSDL_LOCATION的def。

答案 2 :(得分:1)

在生成的代码中(例如:说" 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;
}
*/

一旦你评论了这个,你还需要注释掉默认的construtor,不用说初始化静态WSDL_LOCATION = null; (为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:现在在您实例化此对象的客户端调用中将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。