xstream no puede resolver la excepción de clase

Estoy tratando de usar xstream 1.4.2 para convertir xml en objeto. Funciona perfectamente bien para mí hasta que coloco el archivo de clase del objeto en un paquete separado de donde se ejecuta el código principal. Luego obtengo una excepción CannotResolveClassException. Intenté usar el método setClassLoader según lo recomendado por otros, pero eso no ayuda.

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)

Respuesta xstream espera que la estructura xml sea relativa al paquete en el que se origina (el objeto). Por lo tanto, se debe usar xstream.alias para crear un alias en la estructura xml.

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

De lo contrario, xstream esperará que "Algo" esté en el paquete predeterminado en lugar del paquete del que es miembro.

preguntado el 03 de mayo de 12 a las 20:05

¿Paquete? ¿A qué te refieres con paquete? -

¿Puede publicar el xml y la clase Java que está utilizando para completar?

El nombre completo funciona bien xstream.alias(...), pero ¿cómo funciona con Anotaciones? -

3 Respuestas

Cuando pasa el nombre de la clase al método de alias, necesita pasar el nombre de la clase completo, es decir, el nombre de la clase junto con el nombre del paquete.

Ejemplo: suponga que si la clase Algo está en el paquete com.xyz, entonces debe pasar com.xyz.Algo.clase como parámetro

Muchas Gracias

respondido 31 mar '13, 15:03

Para tu pregunta te será de utilidad

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

respondido 20 mar '14, 14:03

sí, esto no resuelve mi problema pero es útil. Tnx - Pagadoimunto

Pasé media noche tratando de resolver un error similar.
Pasar un controlador a xStream ayudó milagrosamente.

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

Respondido 22 Feb 18, 16:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.