我通过在服务的WSDL中使用 wsimport 创建客户端存根来生成SOAP客户端。
我以这种方式启动我的客户端端口。
URL urlwsdl = new URL ("http://myservice?wsdl");
MyService port = new MyService_Service (urlwsdl).getTimeSeriesServicePort ();
port.foo ();
一切正常。
但我对对象端口的构造函数感到好奇。
为什么需要给它WSDL?存根是基于此生成的。 为什么有必要?
我没有尝试将另一个WSDL放入用于生成它的构造函数中。
答案 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");
希望它能回答您的问题,如果不让我知道,我可以重新回答。