体的对象中?
事实上,JAX-RPC 从清单 2 的 xsd:ArrayOfAnyType schema 中生成了如下的帮助类。
清单 3. 用于 xsd:ArrayOfAnyType schema 的作为结果的帮助类
public class ArrayOfAnyType implements java.io.Serializable {
private java.lang.Object[] anyType;
<!-- The setter, getter, equals() and hashCode() methods -->
}
从清单 3 中,您可以看到 xsd:ArrayOfAnyType schema 的不明确性已经导致 JAX-RPC 工具生成了帮助类。该帮助类将通用的 java.lang.Object[] 数组作为它的私有字段,取代了具体的 Product 数组。
为了消除这种不明确性,您可以使用 ArrayOfRealType 来代替 xsd:ArrayOfAnyType。您应当仅公布具体类型的简单数组(也就是 Product[]),将其作为 Web 服务方法的签名。
对于清单 1 中的 Web 服务,公布前端方法:
清单 4. 公布简单数组 Product[] 的前端方法
[WebMethod]
[XmlInclude(typeof(Product))]
public Product[] updateProductPriceFacade(Product[] products)
{
ArrayList alist = new ArrayList();
IEnumerator it = products.GetEnumerator();
while (it.MoveNext())
alist.Add((Product)(it.Current));
alist = updateProductPrice(alist);
Product[] outArray = (Product[])alist.ToArray(typeof(Product));
return outArray;
}
对于输入输出消息部分的新 schemas 是:
清单 5. 对于清单 4 中的新的 Web 服务的 XML Schema
1. <s:element name="updateProductPriceFacade">
2. <s:complexType>
3. <s:sequence>
4. <s:element minOccurs="0" maxOccurs="1" name="products"
type="s0:ArrayOfProduct" />
5. </s:sequence>
6. </s:complexType>
7. </s:element>
8. <s:complexType name="ArrayOfProduct">
9. <s:sequence>
10. <s:element minOccurs="0" maxOccurs="unbounded" name="Product"
type="s0:Product" />
11. </s:sequence>
12. </s:complexType>
13. <s:element name="updateProductPriceFacadeResponse">
14. <s:complexType>
15. <s:sequence>
16. <s:element minOccurs="0" maxOccurs="1"
name="updateProductPriceFacadeResult" type="s0:ArrayOfProduct" />
17. </s:sequence>
18. </s:complexType>
19. </s:element>
从第 8 行到第 12 行,创建 xsd:ArrayOfProduct schema 来表示具体的 Product 数组。在 schema 中没有出现不确定的内容。所以,最终 Web 服务客户端在反序列化 Products 数组的过程中没有遇到问题。
提高J2EE与.NET之间的互操作性,第2部分(4)
时间:2011-03-14 IBM
含有空元素的数组
含有空元素的数组的 XML 表示不同于 .NET 和 WebSphere。考虑清单 6 中所示的 Java Web 服务方法。
清单 6. 返回含有空元素的数组的 Java 方法
public String[] returnArrayWithNull() {
String[] s = new String[3];
s[0] = "ABC";
s[1] = null;
s[2] = "XYZ";
return s;
}
这里的 String 元素 s[1] 被赋为空值。当 .NET 客户端调用这个部署到 WebSphere 平台上的 Web 服务方法的时候,该 String 数组被序列化成:
清单 7. |