首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Axis2 中的 JAXB 跟 JAX-WS

2012-10-27 
Axis2 中的 JAXB 和 JAX-WS早期的 Apache Axis 建立在第一个面向 Web 服务的 Java 标准 JAX-RPC 的基础之

Axis2 中的 JAXB 和 JAX-WS

早期的 Apache Axis 建立在第一个面向 Web 服务的 Java 标准 JAX-RPC 的基础之上。事实证明,这并不是一个很好的方法,因为 JAX-RPC 限制了 Axis 代码的内部设计,而且造成了性能问题并缺乏灵活性。JAX-RPC 还对 Web 服务开发的方向作出了假设,而这在后来被证明是错误的。

在开始 Axis2 开发工作时,已经着手研究 JAX-RPC 的替代选择,因此,Axis2 在设计时已经考虑到了足够的灵活性,使其能够在基础框架之上实现对替代 Web 服务标准的支持。最新的 Axis2 版本同时实现了对 JAXB 2.x Java XML 数据绑定标准和替代了 JAX-RP 的 JAX-WS 2.x Java Web 服务标准的支持。本文将展示如何将 JAXB 和 JAX-WS 用于 Axis2 并找出 Axis2 对这些标准的当前支持中存在的一些限制。

?

?

Axis2 的 JAXB 支持应该进行扩展,以生成未封装的操作方法(为了方便编程,封装到消息中的值被转换为方法参数 — 再一次建议您参考 “Java Web 服务:Axis2 Data Binding”,获得有关封装接口和未封装接口的讨论。但是使用 WSDL2Java 工具的未封装支持,不管在当前的 Axis2 代码中,还是最近几个发行版中,都不适合这个例子。至少在目前,封装操作方法是惟一可以将 JAXB 用于 Axis2 代码生成的方法(但请立刻参考一下 JAX-WS 讨论 了解另一种替代方法)。对于封装操作接口,每个服务方法都对操作使用一个与输入消息匹配的单一对象参数,并为操作返回一个与输出消息匹配的对象。

附带的代码提供了服务和测试客户机的实际实现,开始处理由运行的 WSDL2Java 生成的类。与本系列早期文章的样例代码相同,下载部分包括用于通过 Apache Ant 构建样例的 build.properties 和 build.xml 文件(位于 jaxb 目录)。您首先需要编辑 build.properties 文件,以将路径设置为您的 Axis2 安装(并修改其他设置,如果系统需要的话)。随后可以在一个打开到 jaxb 目录的控制台中输入 ant 以运行 WSDL2Java,编译附带的和生成的代码,并为服务器部署构建 AAR 文件。要进行尝试,首先将生成的 AAR 文件部署到您的 Axis2 服务器安装并在控制台中输入 ant run

?

如果将 清单 2 与 “Java Web Services: Axis2 Data Binding” 中的客户机代码示例加以比较,会发现它非常类似于 JiBX 和 Axis Data Binding (ADB) 封装例子,主要区别在于 JAXB 封装器类使用 Java 5 类型列表(typed lists)而不是数组(JiBX 数据绑定支持的另一个替换选择,但是不受 ADB 支持)。

// retrieve a book directly String isbn = "0061020052"; BookInformation book = stub.getBook(isbn); if (book == null) { System.out.println("No book found with ISBN '" + isbn + '\''); } else { System.out.println("Retrieved '" + book.getTitle() + '\''); } // retrieve the list of types defined List<TypeInformation> types = stub.getTypes(); System.out.println("Retrieved " + types.size() + " types:"); for (int i = 0; i < types.size(); i++) { TypeInformation type = types.get(i); System.out.println(" '" + type.getName() + "' with " + type.getCount() + " books"); } // add a new book String title = "The Dragon Never Sleeps"; isbn = "0445203498"; try { List<String> authors = new ArrayList<String>(); authors.add("Cook, Glen"); stub.addBook("scifi", isbn, authors, title); System.out.println("Added '" + title + '\''); title = "This Should Not Work"; stub.addBook("scifi", isbn, authors, title); System.out.println("Added duplicate book - should not happen!"); } catch (AddDuplicateFault e) { System.out.println("Failed adding '" + title + "' with ISBN '" + isbn + "' - matches existing title '" + e.getFaultInfo().getBook().getTitle() + '\''); } // get all books of a type List<BookInformation> books = stub.getBooksByType("scifi"); System.out.println("Retrieved " + books.size() + " books of type 'scifi':"); for (int i = 0; i < books.size(); i++) { System.out.println(" '" + books.get(i).getTitle() + '\''); } }}

?

JAX-WS 客户端处理通常要求在运行时访问服务 WSDL,并且使用 WSDL 来初始化服务器链接。如果您已经获知目标服务的 WSDL 始终可以在运行时直接从服务器获得,并且该服务器将始终位于同一地址,那么您可以将 WSDL URL 提供给 WsImport,并让它将 URL 硬编码到生成的代码中。对于大多数严肃的工作,最好使用 WSDL 的本地副本,然后,如果目标服务地址不同于 WSDL 中的地址,那么在运行时重写该地址。附带的构建文件采用了这种方法,而 清单 6 中粗体所示的代码部分演示了如何在不修改 WSDL 的情况下在运行时修改服务地址。


Axis2 中的 JAXB 跟 JAX-WS
Axis2 中的 JAXB 跟 JAX-WS
回页首


描述名字大小下载方法本文源代码j-jws8.zip57KBHTTP

?

原文:http://www.ibm.com/developerworks/cn/java/j-jws8.html

热点排行