当生成 Web 服务存根和使用生成的存根测试 Web 服务时,本例中的每一个部分都将正常工作。但是,因为在结束一个阶段之前您需要使用 Jtest 进行完整的代码检查,所以当您对代码片段运行 Jtest 时,您将看到一条建议:“Return zero-length arrays instead of null”。在犹豫片刻之后后,您将赞同 Jtest 的建议。如果您返回零数组,该代码的客户端必须编写额外的代码来检查返回值是否为零(如清单 13 所示)。
清单13. 用于调用 Web 服务的客户端代码片段
|
当您将 SimpleTask[] tasks = null;(清单 12 中的第 2 行)修改为 SimpleTask[] tasks = new SimpleTasks[0]; 时,您只需将清单 13 编写为:
|
在修改之后,您会认为代码逻辑没有更改,并再次运行客户端来调用 Web 服务,但是现在却引发了异常。到目前为止,您已经根据 Jtest 的建议做了许多小的修补——您忘记修改了什么——这可能导致需要花额外的时间来努力找到发生错误的原因。这个过程真的漫长而乏味。
那么,问题究竟出在什么地方呢?一般来说,对于零对象数组(如 SimpleTask),返回的 SOAP 消息如清单 14 所示。
清单 14. 返回零数组时的 SOAP 消息
|
对于空数组(如 SimpleTask[] tasks = new SimpleTask[0]),SOAP 消息如清单 15 所示。
清单 15. 返回空数组时的 SOAP 消息
|
其不同之处在于 <getSimpleTasksReturn/> 和 <getSimpleTasksReturn xsi:nil = true> 之间。图 2 说明了空数组参数大部分时间是无效的。对于自定义的数据类型(包括另一个自定类型的数组),不要将类变量初始化为空数组——相反,要将其初始化为零数组,尽管所生成的空数组和零数组的 WSDL 定义是相同的。
图 2. 根据 JSR-172 编码零数组参数和空数组参数
结束语
在处理移动 Web 服务时,您需要更加谨慎,因为移动 Web 服务规范只支持部分 API。如果您计划开发移动 Web 服务,则当您处理值类型和集合类型时,我向您介绍了一些窍门。此外,我还提供了以下信息:
- 设计前考虑事项,例如何时使用 Web 服务,以及如何分析使用 Web 服务、套接字或消息传递技术之间的利弊。
- 在决定使用 Web 服务后需要考虑的设计事项,包括:
- 管理粒度
- 设计 Web 服务接口
- 使用 Document/literal 作为编码样式
- 为什么您应该使用 JavaBeans 组件而不是 EJB 技术作为您的服务提供程序
- 为什么您应该避免 XML 元素嵌套太深
- 嵌套和粒度之间的平衡
- 在使用 JAX-RPC 值类型时需要考虑的移动 Web 服务设计事项,包括:
- 公共缺省构造器
- Setter 和 getter 方法
- 使用数组类型而不是 Java Collection 类型
- 确定首选数据类型
- 处理输入和输出参数
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- "Web 服务编程技巧及窍门: 改善 J2EE 与 .NET 之间的互操作性(developerWorks,2005 年 1 月)向您介绍在处理标准 Web 服务时如何管理集合、数组和原型数据类型。
- JSR-172:J2ME Web 服务规范定义了一个可选的包,其提供了从 J2ME 到 Web 服务的标准访问。
- "我应该采用哪一种 WSDL 样式?" (developerWorks,2005 年 5 月)描述了本文所提供的操作模式(以及另外两种模式):RPC/encoded、RPC/literal、Document/encoded、Document/literal 和 Document/literal wrapped 模式。
- Web Services - Interoperability Organization (WS-I) 是一个开放的行业组织,旨在促进跨平台、操作系统和编程语言之间的互操作。
- "Tips and tricks: XML does the job(developerWorks,2002 年 3 月)说明了如何使用 XML-RPC 来定义移动 Web 服务客户端。
- "Cross-platform programming with Java technology and the IBM Web Services Toolkit for Mobile Devices(developerWorks,2003 年 2 月)帮助确保您的 Java 应用程序在不需要修改的情况下作为尽可能多的平台运行。
- JSR-101: Java APIs for XML-based RPC 讨论了如何使用 JAX-RPC 值类型。
- "Using Mobile Devices with the WSTK(developerWorks,2002 年 12 月)说明了 Web Services Tool Kit for Mobile Devices 如何帮助开发在小型移动设备上使用 Web 服务的应用程序。
- "交付 Web 服务至移动式应用程序(developerWorks,2003 年 1 月)说明了如何使用支持 J2ME 的移动设备和 kSOAP 库访问 Web 服务。
- "为移动设备开发 Web 服务客户端 (developerWorks,2003 年 3 月)指导您完成构建 J2ME MIDP 设备上的移动 Web 服务客户端的必要步骤。
- Connected Limited Device Configuration 1.0(CLDC;JSR-30 和 JSR-139)定义了用于资源约束型设备的一组基本 API 和虚拟设备。提供了一个功能强大的 Java 平台,用于开发与 Mobile Information Device Profile (MIDP) 结合在具有有限内存、处理能力和图形功能的设备上运行的应用程序。
- Best practices for Web services 系列(developerWorks,2002 年 10 月)详细介绍了 Web 服务设计考虑事项。
- 请查阅 Safari eReference Bookstore,以找到许多特定于移动和其他技术的主题。
- developerWorks Wireless technology 专区专门发布有关基于移动和普及计算的解决方案的各方面的文章。
获得产品和技术
- Jtest 可以自动完成 Java 单元测试,从正在运行的应用程序自动生成 JUnit 测试用例,以及测试单个类或大型的复杂应用程序。
- Web Services Tool Kit for Mobile Devices (alphaWorks) 是成熟的技术——弄清楚该技术的应用领域。
|
|
Shu Fang Rui 毕业于中国上海交通大学。她对无线技术和 Web 服务非常感兴趣。除了旅行之外,她还喜欢从 | |

