在使用WebService时,可以传递复杂的对象,如本例中的Policy,但是WebService的实现经常有问题,为了规避这个问题,我们可以采用传一个XML串的方式变通实现。其中最主要的问题,Java对象和XML之间的转换通过XStream可以很好地解决。
XStream是一个开源项目,一套简单实用的类库,用于序列化对象与XML对象之间的相互转换。将XML文件内容解析为一个对象或将一个对象序列化为XML文件。XStream可以用于JDK1.3以上的版本使用。
其使用方式非常简单,下面给出一个例子:
- package cn.com.sinosoft.test;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.List;
- import com.thoughtworks.xstream.XStream;
- public class XStreamTest {
- public static void main(String[] args) {
- Policy policy = createTestPolicy();
- XStream xstream = new XStream( );
- //xstream.alias("policy", Policy.class);
- //xstream.alias("item", Item.class);
- String xml = xstream.toXML(policy);
- System.out.println(xml);
- Policy newPolicy = (Policy)xstream.fromXML(xml);
- System.out.println(xstream.toXML(newPolicy));
- }
- private static Policy createTestPolicy(){
- Policy policy = new Policy();
- policy.setPolicyNo("测试保单号");
- List items = new ArrayList();
- policy.setItems(items);
- Item item = new Item();
- item.setItemCode("001");
- item.setItemCode("基本信息");
- items.add(item);
- item = new Item();
- item.setItemCode("002");
- item.setItemCode("扩展信息");
- items.add(item);
- return policy;
- }
- }
- class Policy implements Serializable{
- private static final long serialVersionUID = 1L;
- private String policyNo;
- private List items;
- public String getPolicyNo() {
- return policyNo;
- }
- public void setPolicyNo(String policyNo) {
- this.policyNo = policyNo;
- }
- public List getItems() {
- return items;
- }
- public void setItems(List items) {
- this.items = items;
- }
- }
- class Item implements Serializable{
- private static final long serialVersionUID = 1L;
- private String itemCode;
- private String itemName;
- public String getItemCode() {
- return itemCode;
- }
- public void setItemCode(String itemCode) {
- this.itemCode = itemCode;
- }
- public String getItemName() {
- return itemName;
- }
- public void setItemName(String itemName) {
- this.itemName = itemName;
- }
- }
其中,实例化时需要xstream-[version].jar and xpp3-[version].jar在classpath中。XPP3是一个非常快的XML拉式转换器工具。如果你不想包含这个依赖,你可以使用标准的JAXP DOM转换器来代替。
:这个类的简单设计是为了实现通用操作的。为了实现更复杂的操作你可以选择自己创建出不同方式。
为了使用XStream来更精简的输出XML,你可以为自定义的类创建别名到XML的元素名的映射。这是使用XStream唯一需要的映射的,甚至这个都是可选的。
- xstream.alias("policy", Policy.class);