无法构造java.util.Collection xstream

时间:2015-04-11 23:52:57

标签: java xstream

我在使用XStream库解组某些xml时遇到了麻烦。相关的java类使用java.util.Collection类来存储一些属性,我理解这是XStream的一个问题。但是,由于各种原因,我无法将Java类更改为使用类似ArrayList的内容。有没有办法使用XStream解组xml,还是应该在其他库中搜索解决方案?

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import org.testng.annotations.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ControllerTest {

    @XStreamAlias("controllers")
    public class ControllerList implements Serializable {
        @XStreamImplicit(
                itemFieldName = "controller"
        )
        private List<Controller> controllers = new ArrayList();

        public ControllerList() {
        }

        public List<Controller> getControllers() {
            return this.controllers;
        }

        public void setControllers(List<Controller> controllers) {
            this.controllers = controllers;
        }
    }

    @XStreamAlias("controller")
    public class Controller extends BasicInfo {
        @XStreamImplicit(
                itemFieldName = "storageInfo"
        )
        private Collection<BasicInfo> storage;

        public Controller() {
        }

        public Collection<BasicInfo> getStorage() {
            return this.storage;
        }

        public void setStorage(Collection<BasicInfo> storage) {
            this.storage = storage;
        }
    }

    @XStreamAlias("basicinfo")
    public class BasicInfo{
        private String name;

        public BasicInfo() {
        }

        public String getName() {
            return this.name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @Test(groups = {"edge"})
    public void testControllers() {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><controllers><controller><storageInfo>" +
                "<name>My name</name></storageInfo></controller></controllers>";
        XStream stream = new XStream();
        stream.processAnnotations(ControllerList.class);
        InputStream in = new ByteArrayInputStream(xml.getBytes());
        try {
            InputStreamReader rdr = new InputStreamReader(in, "UTF-8");
            ControllerList controllers = (ControllerList) stream.fromXML(rdr);
        } catch (UnsupportedEncodingException e) {
        }
    }
}

1 个答案:

答案 0 :(得分:1)

XStream CollectionConverter不支持java.util.Collection。所以,你可以尝试两种方式:

  1. Collection替换为List
  2. import java.util.List;
    
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    import com.thoughtworks.xstream.annotations.XStreamImplicit;
    
    @XStreamAlias("controller")
    public class Controller {
    
        @XStreamImplicit(itemFieldName = "storageInfo")
        private List<BasicInfo> storage;
    
        public List<BasicInfo> getStorage() {
            return storage;
        }
    
        public void setStorage(final List<BasicInfo> storage) {
            this.storage = storage;
        }
    
    }
    

    此测试适用于第一种情况:

    @Test
    public void testControllers() {
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><controllers><controller><storageInfo><name>My name</name></storageInfo></controller></controllers>";
        final XStream stream = new XStream();
        stream.processAnnotations(ControllerList.class);
        final ControllerList controllers = (ControllerList) stream.fromXML(xml);
    
        final List<Controller> colls = controllers.getControllers();
        Assert.assertEquals(colls.size(), 1);
    
        final Controller coll = colls.get(0);
    
        final List<BasicInfo> infos = coll.getStorage();
    
        Assert.assertEquals(infos.size(), 1);
    
        final BasicInfo info = infos.get(0);
    
        Assert.assertEquals(info.getName(), "My name");
    }
    
    1. java.util.Collection添加默认实施。该测试应该有效:
    2. @Test
      public void testControllers() {
          final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><controllers><controller><storageInfo><name>My name</name></storageInfo></controller></controllers>";
          final XStream stream = new XStream();
          stream.processAnnotations(ControllerList.class);
          stream.addDefaultImplementation(ArrayList.class, Collection.class);
      
          final ControllerList controllers = (ControllerList) stream.fromXML(xml);
      
          final List<Controller> colls = controllers.getControllers();
          Assert.assertEquals(colls.size(), 1);
      
          final Controller coll = colls.get(0);
      
          final Collection<BasicInfo> infos = coll.getStorage();
      
          Assert.assertEquals(infos.size(), 1);
      
          for (final BasicInfo info : infos) {
              Assert.assertEquals(info.getName(), "My name");
          }
      
      }