Java JAX-WS:Soap客户端-为什么需要WSDL来初始化存根

Java JAX-WS:Soap客户端-为什么需要WSDL来初始化存根,java,soap,wsdl,jax-ws,Java,Soap,Wsdl,Jax Ws,我通过使用wsimport在服务的WSDL之外创建客户机存根,生成了一个SOAP客户机 我用这种方式启动我的客户端端口 URL urlwsdl = new URL ("http://myservice?wsdl"); MyService port = new MyService_Service (urlwsdl).getTimeSeriesServicePort (); port.foo (); 一切正常 但我对对象端口的构造函数很好奇 为什么我需要给它WSDL?存根就是在这个基础上生成的。

我通过使用wsimport在服务的WSDL之外创建客户机存根,生成了一个SOAP客户机

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

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

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

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


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

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

URL urlwsdl=新URLhttp://myservice?wsdl;

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

下面的代码行通常是必需的,比如说您从测试系统或开发系统收到了wsdl,其中URL可能是http://myservice.test/yourservice?wsdl,但稍后,当您升级代码或将其发送给某个第三方时,这些第三方使用相同的服务,但URL可能不同,例如http://myservice.test/yourservice?wsdl. 这就是为什么要在导入时创建此条款。您可以从任何属性文件、数据库、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=新URL传递http://myservice?wsdl;, 它应该类似于URL urlwsdl=新URLhttp://myservice;

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