我按照以下步骤创建了一个 Web 服务:
- 使用 @WebService 和 @WebMethod 注释创建服务接口和实现
- 部署服务
- 使用 wsimport 生成的客户端存根
使用如下所示的客户端程序调用 Web 服务:
public static void main(String[] args) throws Exception { URL url = new URL("http://SERVER:PORT/HelloWorldPOC/HelloWorldPOCImplService?wsdl"); QName qname = new QName("http://helloworld.poc.com/", "HelloWorldPOCImplService"); Service service = Service.create(url, qname); HelloWorldPOCImpl hello = service.getPort(HelloWorldPOCImpl.class); hello.execute("hello"); System.out.println("Done"); }
问题:
- WSDL 位置在客户端程序中提供。WSDL 位置也被硬编码在 wsimport 生成的客户端存根中。为什么会有这种冗余?
我使用 wsimport 使用“localhost”路径创建了客户端存根:
wsimport -keep http://localhost:9080/HelloWorldPOC/HelloWorldPOCImplService?wsdl
- 我从 localhost 运行客户端测试程序,其中 URL 服务器部分为“localhost”。有效。然后从另一个系统运行相同的客户端,其中服务器部分作为服务器的主机名。有效。
- 这意味着不使用生成的客户端存根中的 WSDL 位置吗?
- 我们可以在 localhost 上生成 WSDL 并将其部署到任何地方,而无需重新生成客户端存根?只有调用者客户端需要从部署的服务器检索 WSDL。这是公认的做法,还是我们需要为每个部署的服务器重新生成客户端?