如果一个方法返回如 清单 1 中定义的 Task 的数组,则该方法的源代码包含在下面的清单中,方法 getTasks() 返回一个由五个 Task 对象组成的数组,如清单 2 所示。
清单 2. 返回自定义数据类型的数组的方法
|
当使用 getTasks()(如清单 3 所示)所属的 JavaBean 组件公开 Web 服务时,Task 类映射到其中包含 Task 类的名称空间的 tn2:Task。
清单 3. WSDL 定义中的 XML 数据类型
|
同时,数据类型 Task[] 映射到 ArrayOf_tn2_Task;ArrayOf_tn2_Task 的 XML 描述如清单 4 所示:
清单 4. ArrayOf_tn2_Task 的 XML 描述
|
如清单 4 所示,为单个自定义复杂类型数组生成的 XML 描述很长。相反,Java 语言中的单个 String 类型映射到 xsd:string,而没有生成 complexType 元素;诸如 boolean、int 和 byte 这样的基元类型分别映射到 xsd:boolean、xsd:int 和 xsd:byte。
您可能已经注意到 XML 元素的嵌套(避免嵌套太深)和粒度考虑(使用粗粒度)之间的冲突。在实际运用中,嵌套和粒度之间应该有一个平衡。如果您更关注应用程序的性能,则应该仔细地权衡这两个考虑事项,以获得一个更好的解决方案。
移动 Web 服务的设计考虑事项
我已经讨论了设计 Web 服务的指导原则,现在我将把重点放在移动 Web 服务的考虑事项上。在大多数情况下,当将 JAX-RPC 值类型用于移动 Web 服务时需要考虑一些事情。JAX-RPC 值类型(遵循 JSR-101)是 Java 类,其值可以在服务客户端和服务端点之间移动。为了获得一致的值类型,必须遵循一系列规则。我只列出其中的几条,与本文关系最大的规则是:
- 您必须具有公共缺省构造器。
- 您必须具有用于需要在网络上传输的字段的 setter 和 getter 方法。
- 在处理数据集合时您应该使用数组。
- 移动 Web 服务中有一些首选的数据类型。
- 在处理输入和输出参数时注意可能出现的问题。
在反序列化的过程中,SOAP 运行时环境使用缺省构造器来构造对象。如果您试图在没有公共缺省构造器的情况下编写值类型(也称为数据传输对象),在当 JAX-RPC 运行时尝试序列化和反序列化数据对象时可能会遇到错误。对于像 IBM Rational® Application Developer (RAD) 6.0 这样的 IDE,将不为该数据类型生成序列化和反序列化 Helper 类(由 RAD 通过前缀 _Helper、_Ser 和 _Deser 生成),所以在调用与自定义数据类型相关的方法时会出现序列化错误。不带参数的构造器确保可以根据序列化状态远程构造对象。
您必须具有用于网络传输字段的 setter 和 getter 方法
首先,看一看清单 5 中的类 FailTask 的源代码:
清单 5. FailTask 类的定义
|
