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 10008 1 1 NULL nidRbc INTEGER RBC identity 1 1 1 0 NULL 0:16382
我最近面临同样的问题。 问题是,在xml请求中我没有给出完整的限定名称。
GLOBAL
在意识到这个问题之后,我把它改成了
GLOBAL
从那时起它工作正常。