JAX-WS部署最佳实践:WSDL位置和客户端生成

时间:2012-09-05 09:28:00

标签: jax-ws

我按照以下步骤创建了一个Web服务:

  • 创建了一个服务界面&使用@WebService和@WebMethod注释实现
  • 部署服务
  • 使用wsimport生成的客户端存根
  • 使用如下所示的客户端程序调用webservice:

    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。这是接受的做法,还是我们需要为每个部署的服务器重新生成客户端?

1 个答案:

答案 0 :(得分:1)

  1. 您可以将其理解为默认位置,将被覆盖99%。在我生成的代码中,也可以在没有指定wsdl URL的情况下创建服务,因此将使用默认URL。
  2. 当您覆盖wsdl文件的默认URL地址时,当然不会使用它。很多时候webservice生产者只给我们wsdl文件,然后我们从wsdl生成存放在本地硬盘上的存根,所以我们总是需要覆盖默认值。
  3. PS:我可以闲聊另一种技术如何在没有存根生成的情况下调用webservices。您只需要在客户端上使用“远程接口”(由服务器类实现)。当您负责生成和使用Web服务时,它非常有效。当接口发展时非常有效,因为当您更改它时,您不需要重新生成存根。以下是JBoss 7(JAX-WS)作为客户端上使用的服务器和Apache CXF库的示例:http://www.mastertheboss.com/jboss-web-services/developing-web-services-on-jboss-as-7