首页 > 解决方案 > JAX-WS: Soap-Client - 为什么需要 WSDL 来初始化存根

问题描述

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

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

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

一切正常。

但是我很好奇对象端口的构造函数。

为什么我需要给它 WSDL?存根是在此基础上生成的。为什么这是必要的?

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

标签: javasoapwsdljax-ws

解决方案


无需在代码行下方编写代码。

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");

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


推荐阅读