java - com.thoughtworks.xstream.mapper.CannotResolveClassException

标签 java xstream

这是我第一次尝试 XStream。 但是当我尝试解析我的 xml 文件时,出现了这个异常:

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 看起来像这样:

- <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>

涉及的其他类如下所示:

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.

这个错误的原因是什么?

最佳答案

你得到这个异常的原因是因为你没有你的 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 以提高可读性:

<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>

关于java - com.thoughtworks.xstream.mapper.CannotResolveClassException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283052/

相关文章:

java - X流: node with attributes and text node?

java - NoClassDefFound错误: com/itextpdf/text/DocumentException when exporting jasper to pdf

java - 将 JLabel 添加到 JTabbedPane 中的 JTextArea?

java - 使用 xstream 解析大型 xml 文件时出现 OutOfMemoryError

java - 可以从 List 生成平面 XML 结构的 XStream 自定义转换器?

java - Java 中的 XStream 私有(private)属性

java - 使用 spring-rabbit 从消息中提取 header ,无需在注释中声明队列

java - 返回重叠的正则表达式

java - 是否有任何java压缩实用程序

java - 查找 XStream api 中是否存在节点