0

我正在 Windows Werver 2012 上运行的 Glassfish 上构建一个带有 java 客户端和 java web 服务的 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转换来生成所需的 java 源文件,这些文件来自 WS 发出的 WSDL xml。

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

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

我从客户端获得更新的数组列表:书籍,音乐,电影+“笔”

  • 但是如果我向 che 类添加一个新方法,该方法对客户端不可见,怎么会?
  • 是因为我需要再次在 WSDL 文件上运行 WSIMPORT 并重新编译客户端吗?
  • 如果上述情况属实,是否有办法避免每次服务器端/webservice 代码发生更改时生成 WSIMPORT 类/源文件?

谢谢路德

4

2 回答 2

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)。有优点也有缺点。根据您的用例,这可能是一个解决方案。

于 2013-07-18T10:13:19.700 回答
0

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

于 2013-10-31T09:59:25.080 回答