3

我按照以下步骤创建了一个 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");
    }
    

问题:

  1. WSDL 位置在客户端程序中提供。WSDL 位置也被硬编码在 wsimport 生成的客户端存根中。为什么会有这种冗余?
  2. 我使用 wsimport 使用“localhost”路径创建了客户端存根:

    wsimport -keep http://localhost:9080/HelloWorldPOC/HelloWorldPOCImplService?wsdl
    
    • 我从 localhost 运行客户端测试程序,其中 URL 服务器部分为“localhost”。有效。然后从另一个系统运行相同的客户端,其中服务器部分作为服务器的主机名。有效。
    • 这意味着不使用生成的客户端存根中的 WSDL 位置吗?
    • 我们可以在 localhost 上生成 WSDL 并将其部署到任何地方,而无需重新生成客户端存根?只有调用者客户端需要从部署的服务器检索 WSDL。这是公认的做法,还是我们需要为每个部署的服务器重新生成客户端?
4

1 回答 1

2
  1. 您可以将其理解为默认位置,它将被 99% 覆盖。在我生成的代码中,也可以在没有指定 wsdl URL 的情况下创建服务,因此将使用默认 URL。
  2. 当您覆盖 wsdl 文件的默认 URL 地址时,当然不会使用它。很多时候webservice producer只给我们wsdl文件,然后我们从wsdl生成存根放在本地硬盘上,所以我们总是需要覆盖默认值。

PS:我可以八卦另一种技术如何在不生成存根的情况下调用 Web 服务。您只需要客户端上可用的“远程接口”之类的东西(由服务器类实现)。当您负责生产和使用 Web 服务时,它非常有效。当接口演变时它非常有效,因为当你改变它时,你不需要重新生成存根。以下是 JBoss 7 (JAX-WS) 作为服务器和客户端上使用的 Apache CXF 库的示例:http: //www.mastertheboss.com/jboss-web-services/developing-web-services-on-jboss-as- 7

于 2013-05-10T17:13:30.650 回答