Com.thoughtworks.xstream.mapper.CannotResolveClassException

This is the time when I try XStream. But when I try to parse my XML file, I get this 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) 

So we see that the error is on line 20 in my testXML class. And it looks like this:

 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); } } 

And line 20 is the line: 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.. 

And the xml looks like this:

 - <root> - <info> <CORE_NAME>DataModel_Core</CORE_NAME> <CORE_VERSION>..</CORE_VERSION> <CORE_PRODUCT_ID>...</CORE_PRODUCT_ID> <ADAPTATION_NAME /> <ADAPTATION_VERSION /> <ADAPTATION_PRODUCT_ID /> </info> - <type> <OBJECT_TYPE>data</OBJECT_TYPE> - <prop> <DESCRIPTION>Site parameters</DESCRIPTION> <PARENT>NULL</PARENT> <VIRTUAL>0</VIRTUAL> <VISIBLE>1</VISIBLE> <PICTURE>NULL</PICTURE> <HELP>10008</HELP> <MIN_NO>1</MIN_NO> <MAX_NO>1</MAX_NO> <NAME_FORMAT>NULL</NAME_FORMAT> </prop> - <param> <PARAMETER>nidRbc</PARAMETER> <DATA_TYPE>INTEGER</DATA_TYPE> <DESCRIPTION>RBC identity</DESCRIPTION> <MIN_NO>1</MIN_NO> <MAX_NO>1</MAX_NO> <ORDER1>1</ORDER1> <NESTED>0</NESTED> <DEFAULT1>NULL</DEFAULT1> <FORMAT>0:16382</FORMAT> </param> </type> 

Other participating classes are as follows:

 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. 

What is the reason for this error?

+6
source share
2 answers

The reason you get this exception is because you do not have a view for the root of the xml elements and information about your xml.

So, when the XStream reads this xml file, it searches for the class corresponding to the root element. If you don't have a specific alias / match, it will try the tag name as the class name.

So, instead of:

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

use something like this:

 @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. } 

For your reference, I formatted your xml to make reading more understandable:

 <root> <info> <CORE_NAME>DataModel_Core</CORE_NAME> <CORE_VERSION>..</CORE_VERSION> <CORE_PRODUCT_ID>...</CORE_PRODUCT_ID> <ADAPTATION_NAME /> <ADAPTATION_VERSION /> <ADAPTATION_PRODUCT_ID /> </info> <type> <OBJECT_TYPE>data</OBJECT_TYPE> <prop> <DESCRIPTION>Site parameters</DESCRIPTION> <PARENT>NULL</PARENT> <VIRTUAL>0</VIRTUAL> <VISIBLE>1</VISIBLE> <PICTURE>NULL</PICTURE> <HELP>10008</HELP> <MIN_NO>1</MIN_NO> <MAX_NO>1</MAX_NO> <NAME_FORMAT>NULL</NAME_FORMAT> </prop> <param> <PARAMETER>nidRbc</PARAMETER> <DATA_TYPE>INTEGER</DATA_TYPE> <DESCRIPTION>RBC identity</DESCRIPTION> <MIN_NO>1</MIN_NO> <MAX_NO>1</MAX_NO> <ORDER1>1</ORDER1> <NESTED>0</NESTED> <DEFAULT1>NULL</DEFAULT1> <FORMAT>0:16382</FORMAT> </param> </type> </root> 
+8
source

I recently ran into the same problem. The problem is that in the xml request I did not give the fully qualified name.

 <FeatureContextRequest> <featureRequestType>GLOBAL</featureRequestType> </FeatureContextRequest> 

Realizing the problem, I changed it to

 <com.xxxx.yyyy.services.features.FeatureContextRequest> <featureRequestType>GLOBAL</featureRequestType> </com.xxxx.yyyy.services.features.FeatureContextRequest> 

It has been working fine ever since.

0
source

All Articles