Java:WSDL Web服务wsimport,我是否需要重新运行wsimport我改变webservice服务器中的@WebService类代码

时间:2013-07-18 09:40:35

标签: java web-services wsdl glassfish wsimport

我正在Windows Werver 2012上运行的Glassfish上构建一个带有Java客户端和java webservice的web服务。

这是我的@WebService类:

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

@WebService
public class ProductCatalog {

    public List<String> getProductCategories(){
     List<String> categories = new ArrayList<>();
     categories.add("Books");
     categories.add("Music");
     categories.add("Movies");

     return categories;
   }
}

客户端上创建存根方法我使用java中的 wsimport 转换来生成从WS发出的WSDL xml中提交的所需java源文件

我注意到的是,如果我在列表中添加一个cetgory:

     //...code
     categories.add("Books");
 categories.add("Music");
 categories.add("Movies");
 categories.add("Pens");
     //...code

我从客户端获得更新的arraylist:书籍,音乐,电影+“钢笔”

  • 但如果我向che class添加一个新方法,则该方法不可见 客户方,怎么回事?
  • 是因为我需要再次在WSDL文件上运行WSIMPORT 重新编译客户端?
  • 如果上述情况属实,是否有办法避免使用WSIMPORT 每次有变化时生成类/源文件 Serverside / webservice代码?

感谢Luther

2 个答案:

答案 0 :(得分:1)

Web服务通常用于进程间通信,因此需要强大的合同来操作服务。 WSDL提供了这种合同的手段。因此,每次合同发生变化时,您都需要更新WSDL。

但是,仍然存在一个选项,其中服务调用不需要WSDL。可以使用动态调用(https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Development_Guide/Develop_a_JAX-WS_Client_Application.html)来实现。有利有弊。根据您的使用情况,这可能是一个解决方案。

答案 1 :(得分:0)

实现此目的的一种方法是在单独的类中编写业务逻辑并在服务类中调用该方法。将getProductCategories()方法放入其他类并创建该类的实例并调用方法。所以您在业务类中添加新方法,无需更改wsdl或任何内容。但不要更改方法签名和参数。