2012-05-03 8 views
10

Ich versuche Xstream 1.4.2 zu verwenden, um XML in Objekt zu konvertieren. Es funktioniert völlig in Ordnung für mich, bis ich die Klassendatei des Objekts in ein separates Paket als wo der Hauptcode ausgeführt wird. Dann bekomme ich eine CannotResolveClassException. Ich habe versucht, die setClassLoader-Methode wie von anderen empfohlen, aber das hilft nicht.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) 

Antwort: xstream erwartet, dass die XML-Struktur an die Verpackung relativ zu sein, in dem es (das Objekt) stammt. Also muss xstream.alias verwendet werden, um die XML-Struktur zu aliasieren.

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

Sonst wird xstream „Something“ erwartet im Standard-Paket zu sein, anstatt das Paket ist ein Mitglied.

+0

Paket? Was meinst du mit Paket? –

+0

können Sie die xml und die Java-Klasse, die Sie verwenden, posten –

+0

Der voll qualifizierte Name funktioniert gut 'xstream.alias (...)', aber wie funktioniert es mit Annotationen? – lvr123

Antwort

7

Wenn Sie den Klassennamen an die Alias-Methode übergeben, müssen Sie den vollständig qualifizierten Klassennamen übergeben, z. B. den Klassennamen zusammen mit dem Paketnamen.

Beispiel: Nehmen wir an, wenn die Klasse etwas im Paket com.xyz ist, dann müssen Sie com.xyz.Something.class als Parameter

Dank

0

Für Ihre Frage passieren wird es nützlich sein

Herunterladen 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

ja, das löst mein Problem nicht, aber es ist nützlich.Tnx – Payedimaunt

0

halben Abend damit verbracht, ähnlich e lösen Fehler.
Die Weitergabe eines Treibers an xStream half auf wundersame Weise.

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