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 放入用于生成它的构造函数中。

没有必要在代码行下面编写代码。

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

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

最新更新