xstream no puede resolver la excepción de clase
Frecuentes
Visto 29,653 veces
11
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.
3 Respuestas
7
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
0
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
0
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 java xstream or haz tu propia pregunta.
¿Paquete? ¿A qué te refieres con paquete? - Marko Topolnik
¿Puede publicar el xml y la clase Java que está utilizando para completar? Dev Blanked
El nombre completo funciona bien
xstream.alias(...)
, pero ¿cómo funciona con Anotaciones? - lvr123