2012-05-03 25 views
10

我正在嘗試使用xstream 1.4.2將xml轉換爲對象。它直到我將對象的類文件放在一個單獨的包中,而不是主代碼運行之前,它對我來說工作得非常好。然後我得到一個CannotResolveClassException。我嘗試使用其他人推薦的setClassLoader方法,但這沒有幫助。xstream CannotResolveClassException

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會期望「Something」在默認包中,而不是它所在的包中。

+0

包?包是什麼意思? –

+0

您可以發佈您正在使用的xml和java類來填充 –

+0

完全限定的名稱很好地適用於'xstream.alias(...)',但它如何與Annotations一起使用? – lvr123

回答

7

當您將類名稱傳遞給別名方法時,您需要傳遞完全限定的類名稱,即類名稱及其包名稱。

例:假設如果類的東西是在包com.xyz,那麼你需要通過com.xyz.Something.class作爲參數

感謝

0

對於你的問題將是有益

下載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> 
+0

是的,這不能解決我的問題,但它是有用的.Tnx – Payedimaunt

0

花了半個晚上試圖解決類似è RROR。
將驅動程序傳遞給xStream奇蹟般地幫助。

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