Xstream CannotResolveClassException
Я пытаюсь использовать xstream 1.4.2 для преобразования xml в объект. Это работает отлично для меня, пока я не поместил файл класса объекта в отдельный пакет, кроме основного кода. Затем я получаю исключение CannotResolveClassException. Я попытался использовать метод setClassLoader, как рекомендовано другими, но это не помогает.
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 ожидает, что "что-то" будет в пакете по умолчанию, а не в пакете, в котором он входит.
Ответы
Ответ 1
Когда вы передаете имя класса методу псевдонима, вам необходимо передать полное имя класса i.e имя класса вместе с его именем пакета.
Пример: предположим, что класс Something находится в пакете com.xyz, тогда вам необходимо передать com.xyz.Something.class в качестве параметра
Спасибо
Ответ 2
По вашему вопросу это будет полезно
Загрузить 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>
Ответ 3
Провел половину вечера, пытаясь разрешить подобную ошибку.
Передача драйвера xStream чудом помогла.
XStream xstream = new XStream(new StaxDriver());