JAX-WS:Soap-Client-为什么需要WSDL来初始化存根

时间:2018-08-08 20:07:20

标签: java soap wsdl jax-ws

我通过在服务的WSDL中使用 wsimport 创建客户端存根来生成SOAP客户端。

我以这种方式启动我的客户端端口。

URL urlwsdl = new URL ("http://myservice?wsdl");
MyService port = new MyService_Service (urlwsdl).getTimeSeriesServicePort ();
port.foo ();

一切正常。

但我对对象端口的构造函数感到好奇。

为什么需要给它WSDL?存根是基于此生成的。 为什么有必要?

我没有尝试将另一个WSDL放入用于生成它的构造函数中。

1 个答案:

答案 0 :(得分:1)

不必在代码行下面编写代码。

URL urlwsdl = new URL ("http://myservice?wsdl");

您可以避免这种情况,它也应该可以正常工作。

通常需要以下代码行,例如从测试系统或开发系统获得了wsdl,其中URL可能是http://myservice.test/yourservice?wsdl,但后来您升级了代码或将其交付给某些公司使用相同服务但URL可能不同的第三方,例如http://myservice.test/yourservice?wsdl。这就是为什么创建此规定wsimport的原因。您可以从任何属性文件或数据库,yml或ObjectFactory等中注入URL。

您的服务代码必须类似于以下内容,

    public interface AddressBookService extends ...Service {
      public String getAddressBookAddress();

      public AddressBook getAddressBook() throws ...ServiceException;

      public AddressBook getAddressBook(URL portAddress)
          throws javax.xml.rpc.ServiceException;
    }

而且,您可以使用其他代码,这些代码也可以正常工作,而无需您明确指定端口。

MyService service = new MyService();

// Now use the service to get a stub which implements the SDI.
port.foo();

理想情况下,您不应将URL作为URL urlwsdl = new URL ("http://myservice?wsdl");传递,它应该类似于URL urlwsdl = new URL ("http://myservice");

希望它能回答您的问题,如果不让我知道,我可以重新回答。