com.thoughtworks.xstream.mapper.CannotResolveClassException

这是我尝试XStream的第一次。 但是当我尝试解析我的xml文件时,我得到了这个exception:

Exception in thread "main" com.thoughtworks.xstream.mapper.CannotResolveClassException: root at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45) at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133) at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1157) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1141) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1012) at com.mmm.transport.se.xmleditor.xml.TestXML.test(TestXML.java:20) at com.mmm.transport.se.xmleditor.domain.Main.main(Main.java:13) 

所以我们可以看到错误在我的testXML类的第20行。 它看起来像这样:

 public class TestXML { public void test() throws FileNotFoundException { FileReader reader = new FileReader("xmlFiles/CoreDatamodel.xml"); XStream xstream = new XStream(); xstream.processAnnotations(Properties.class); xstream.processAnnotations(Parameters.class); xstream.processAnnotations(ObjType.class); xstream.processAnnotations(Type.class); Type data = (Type) xstream.fromXML(reader); System.out.println(data); } } 

第20行是这一行: xstream.processAnnotations(Parameters.class);

 @XStreamAlias("param") public class Parameters { @XStreamAlias("DATATYPE") private String datatype; @XStreamAlias("DESCRIPTION") private String description; @XStreamAlias("MIN_NO") private String min_no; @XStreamAlias("MAX_NO") private String max_no; @XStreamAlias("ORDER1") private String order1; @XStreamAlias("NESTED") private String nested; @XStreamAlias("DEFAULT1") private String default1; @XStreamAlias("FORMAT") private String format; @XStreamAlias("PARAMETER") private String parameter; public Parameters(String datatype, String description, String min_no, String max_no, String order1, String nested, String default1, String format, String parameter) { super(); setDatatype(datatype); setDescription(description); setMin_no(min_no); setMax_no(max_no); setOrder1(order1); setNested(nested); setDefault1(default1); setFormat(format); setParameter(parameter); } //Getters and setters.. 

而xml看起来像这样:

 -  -  DataModel_Core .. ...     -  data -  Site parameters NULL 0 1 NULL 10008 1 1 NULL  -  nidRbc INTEGER RBC identity 1 1 1 0 NULL 0:16382   

其他涉及的类看起来像这样:

 public class Type { @XStreamImplicit(itemFieldName = "type") private List types = new ArrayList(); } public class ObjType { @XStreamAlias("OBJECT_TYPE") private String objectType; public ObjType() { } // Getters and setters @XStreamAlias("prop") public class Properties { @XStreamAlias("DESCRIPTION") private String description; @XStreamAlias("PARENT") private String parent; @XStreamAlias("VIRTUAL") private String virtual; @XStreamAlias("VISIBLE") private String visible; @XStreamAlias("PICTURE") private String picture; @XStreamAlias("HELP") private String help; @XStreamAlias("MIN_NO") private String min_no; @XStreamAlias("MAX_NO") private String max_no; @XStreamAlias("NAME_FORMAT") private String name_format; public static Properties instance = null; public static Properties getInstance() { if (instance == null) { instance = new Properties(); } return instance; } public Properties() { } // Getters and Setters. 

这个错误的原因是什么?

出现此exception的原因是因为您没有xml元素根的表示和xml的信息。

因此,当XStream读取该xml文件时,它正在搜索与根元素匹配的类。 如果您没有定义别名/映射,它将尝试将标记名称作为类名。

所以,而不是:

 public class Type { @XStreamImplicit(itemFieldName = "type") private List types = new ArrayList(); } 

使用类似的东西:

 @XStreamAlias("root") public class Type { private Info info; @XStreamImplicit(itemFieldName = "type") private List types = new ArrayList(); } private class Info { // ... define the attributes for the info element here. } 

为了您的参考,我已经格式化了您的xml以使事物更具可读性:

   DataModel_Core .. ...      data  Site parameters NULL 0 1 NULL 10008 1 1 NULL   nidRbc INTEGER RBC identity 1 1 1 0 NULL 0:16382    

我最近面临同样的问题。 问题是,在xml请求中我没有给出完整的限定名称。

  GLOBAL  

在意识到这个问题之后,我把它改成了

  GLOBAL  

从那时起它工作正常。