【问题标题】:xstream CannotResolveClassExceptionxstream 无法解决类异常
【发布时间】:2012-05-03 19:31:52
【问题描述】:

我正在尝试使用 xstream 1.4.2 将 xml 转换为对象。在我将对象的类文件放在一个单独的包中,而不是主代码运行的地方之前,它对我来说确实工作得很好。然后我得到一个CannotResolveClassException。我已经尝试使用其他人推荐的 setClassLoader 方法,但这没有帮助。

Exception in thread "main" com.thoughtworks.xstream.mapper.CannotResolveClassException: result
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56)
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:1052)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:912)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:903)
at main.readClass(main.java:48)
at main.main(main.java:28)

答案: xstream 期望 xml 结构与其(对象)源自的包相关。所以必须使用 xstream.alias 来给 xml 结构取别名。

xstream.alias("something", Something.class);

否则 xstream 将期望“某物”在默认包中,而不是它所属的包中。

【问题讨论】:

  • 包裹?包是什么意思?
  • 你能发布你用来填充的xml和java类吗
  • 完全限定名称xstream.alias(...) 效果很好,但它如何与注释一起使用?

标签: java xstream


【解决方案1】:

当您将类名传递给别名方法时,您需要传递完全限定的类名,即类名及其包名。

示例:假设如果类 Something 在包 com.xyz 中,那么您需要将 com.xyz.Something.class 作为参数传递

谢谢

【讨论】:

    【解决方案2】:

    对你的问题很有用

    下载 Xtream.jar

    package businessfunctions;
    
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    import objectrepository.LoginPojo;
    import objectrepository.LoginPojos;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.io.xml.DomDriver;
    
        public void readRepository(String fNmae){
    
            // Instantiate XStream Object
            XStream xstream = new XStream(new DomDriver()); 
    
            // Set Person class into xstream alias
            xstream.alias("loginpojos",LoginPojos.class);
            xstream.alias("loginpojo",LoginPojo.class);
    
            xstream.addImplicitCollection(LoginPojos.class, "loginpojos");
    
            // Create a StringBuffer var
            StringBuffer contents = new StringBuffer();
    
             try {
                    // TODO Auto-generated method stub
    
    
                    // Set BufferReader var "in" to read from PersonXML.xml file
                    BufferedReader in = new BufferedReader(new FileReader(repoPath+fNmae));
    
                    String str;
    
                    while ((str = in.readLine()) != null) {
                    contents.append(str);
                    }
    
                    in.close();
    
                 } catch (IOException e) {
                        System.out.println(e.toString());
                 }
                // Checking the StringBuffer variable "contents"
                System.out.println(contents);
    
                String content = new String();
    
                // Put all the contents from contents to String variable content --xstream.fromXML()takes
                //only String
                content = contents.toString();
    
                // Convert content into XML and change and set to obj newPerson of class Person
                LoginPojos loginPojosList = (LoginPojos)xstream.fromXML(content);
    
                List<LoginPojo> loginPojoList = loginPojosList.getLoginpojos();
                for(LoginPojo newLogiPojo:loginPojoList){
                // Print out the newPerson properties
                System.out.println("Property Label: " + newLogiPojo.getPropLabel());
                System.out.println("Property Name: " + newLogiPojo.getPropName());
                System.out.println("Property Value: " + newLogiPojo.getPropValue());
                }
    
                 }
    
    
    
    public static void main(String args[]) {
             try {
                 DriverSetup ds= new DriverSetup();
                 ds.readRepository("login.xml");  
    
             }catch(Exception e){
                e.printStackTrace(); 
             }
    
    package objectrepository;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class LoginPojos {
    
         public List<LoginPojo> loginpojos = new ArrayList<LoginPojo>();
    
        public List<LoginPojo> getLoginpojos() {
            return loginpojos;
        }
    
        public void setLoginpojos(List<LoginPojo> loginpojos) {
            this.loginpojos = loginpojos;
        }
    
    
    
    }
    
    
    package objectrepository;
    
    public class LoginPojo {
    
        private String propLabel;
        private String propName;
        private String propValue;
        public String getPropLabel() {
            return propLabel;
        }
        public void setPropLabel(String propLabel) {
            this.propLabel = propLabel;
        }
        public String getPropName() {
            return propName;
        }
        public void setPropName(String propName) {
            this.propName = propName;
        }
        public String getPropValue() {
            return propValue;
        }
        public void setPropValue(String propValue) {
            this.propValue = propValue;
        }
    
    
    
    }
    
    
    <loginpojos>
    <loginpojo>
    <propLabel>User name1</propLabel>
    <propName>id1</propName>
    <propValue>username1</propValue>
    </loginpojo>
    <loginpojo>
    <propLabel>User name</propLabel>
    <propName>id</propName>
    <propValue>username</propValue>
    </loginpojo>
    </loginpojos>
    

    【讨论】:

    • 是的,这不能解决我的问题,但它很有用。Tnx
    【解决方案3】:

    花了半个晚上试图解决类似的错误。
    将驱动程序传递给 xStream 奇迹般地有所帮助。

    XStream xstream = new XStream(new StaxDriver());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多