2012-05-03 16 views
10

Tôi đang cố gắng sử dụng xstream 1.4.2 để chuyển đổi xml thành đối tượng. Nó làm việc hoàn toàn tốt cho tôi cho đến khi tôi đặt tệp lớp của đối tượng trong một gói riêng biệt hơn là nơi mã chính chạy. Sau đó, tôi nhận được một NotResolveClassException. Tôi đã thử sử dụng phương thức setClassLoader như được đề xuất bởi những người khác nhưng điều đó không giúp ích gì.xstream Không thểResolveClassException

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) 

Trả lời: XStream hy vọng cấu trúc xml để được liên quan đến gói trong đó nó (đối tượng) có nguồn gốc từ đâu. Vì vậy, xstream.alias phải được sử dụng để bí danh cấu trúc xml.

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

Nếu không xstream sẽ mong đợi "Cái gì đó" nằm trong gói mặc định chứ không phải gói đó là thành viên.

+0

Gói? Ý bạn là gì? –

+0

bạn có thể đăng xml và lớp java bạn đang sử dụng để điền –

+0

Tên đủ điều kiện hoạt động tốt 'xstream.alias (...)', nhưng nó hoạt động như thế nào với chú thích? – lvr123

Trả lời

7

Khi bạn chuyển tên lớp cho phương thức bí danh, bạn cần chuyển tên lớp đầy đủ, tức là tên lớp cùng với tên gói của nó.

Ví dụ: Giả sử nếu Something lớp là trong com.xyz gói sau đó bạn cần phải vượt qua com.xyz.Something.class như tham số

Cảm ơn

0

Đối với câu hỏi của bạn nó sẽ hữu ích

Tải 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

có, điều này không giải quyết được sự cố của tôi nhưng nó hữu ích.Tnx – Payedimaunt

0

gian nửa buổi tối cố gắng giải quyết tương tự như e rror.
Chuyển trình điều khiển đến xStream một cách kỳ diệu đã giúp.

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