所生成的 WSDL 定义中的 XML 数据类型定义如清单 8 所示。
清单 8. 与清单 7 对应的 WSDL 定义
<wsdl:types>
<schema targetNamespace="http://ws.test.ibm.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:impl="http://ws.test.ibm.com" xmlns:intf="http://ws.test.ibm.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<element name="addTwoResponse">
<complexType>
<sequence>
<element name="addTwoReturn" type="xsd:float"/>
</sequence>
</complexType>
</element>
<element name="addTwo">
<complexType>
<sequence>
<element name="a" type="xsd:float"/>
<element name="b" type="xsd:float"/>
<element name="b" type="xsd:float"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
|
对于针对 CLDC 1.0 的 Web 服务客户端,所生成的存根如清单 9 所示。
清单 9. 为 CLDC 1.0 生成的客户端存根
public interface TaskWs extends java.rmi.Remote {
public java.lang.String addTwo(java.lang.String _a, java.lang.String _b)
throws java.rmi.RemoteException, javax.xml.rpc.JAXRPCException;
}
|
所以,当调用 CLDC 1.0 中的 Web 服务时,您必须使用 addTwo() 方法提供两个 String 参数,而对于针对平台 CLDC 1.1 的 Web 服务客户端,所生成的服务接口与清单 10 中所描述的类似:
清单 10. 为 CLDC 1.1 生成的客户端存根
public interface TaskWs extends java.rmi.Remote {
public float addTwo(float _a, float _b)
throws java.rmi.RemoteException, javax.xml.rpc.JAXRPCException;
}
|
这将 xsd:float 映射到所生成的客户端存根中的 float 类型。看到 CLDC 1.0 和 CLDC 1.1 之间的不同之处了吗?
在为移动设备开发 Web 服务时,请注意 float 和 double 类型,因为 CLDC 1.0 虚拟机实现无法加载为 CLDC 1.1 生成的存根(使用到 float 和 double 的本机映射)。同时针对 CLDC 1.0 和 CLDC 1.1 的 Java 2 Platform Micro Edition (J2ME) 应用程序的开发人员应该使用到 java.lang.String 的缺省映射,以获得最好可重用性。
在处理输入和输出参数时注意可能出现的问题
JSR-172 指定了以副本的形式传送并以副本的形式创建返回值的所有参数。但是,当处理数据集合时,零数组 (返回零)和空数组 (返回其本身)需要密切关注。
我的建议是尽可能地避免使用空数组。当处理移动 Web 服务时,空数组可能是一个问题。
假定您需要返回任务对象数组。原始代码如清单 11 所示。
清单 11. 一个简单的值对象
public class SimpleTask {
/**
* The name of the task
*/
private String name;
/**
* The default constructor
*
*/
public SimpleTask() {
}
/**
* @return Returns the name of the task.
*/
public String getName() {
return name;
}
/**
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}
}
|
Web 服务实现如清单 12 所示。
清单 12. 返回值对象的数组的方法
1 public SimpleTask[] getSimpleTasks(){
2 SimpleTask[] tasks = null;
3 /*
4 * Your code dealing with DB goes here
5 * ....
6 * tasks = ...
7 */
8 return tasks;
9 }
|