Я создал некоторые OSGi-пакеты. Одна из них имеет функцию экспорта данных в xml с помощью XStream. Он просто отлично работает. Также импортируется снова при использовании библиотеки Bundle в качестве библиотеки, а не в контексте OSGi.Deserializing XML с использованием XStream не работает в OSGi (Java 1.4)
Но если я называю импорт в другой пачке я получаю «com.thoughtworks.xstream.converters.ConversionException» с follwing Debugging информация распечатывается:
---- Debugging information ----
message : Cannot find class ChildDate
cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message : Cannot find class ChildData
class : ChildData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
message : Could not call ParentData.readObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot find class ParentData : Cannot find class ChildData
class : ParentData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
Я думаю, что это такая же проблема с этим : XStream and OSGi или это: CannotResolveClassException in OSGi environment
Итак, я попытался решить проблему, задав ClassLoader. Но это не работает.
Части моего класса ParentData:
public class ParentData implements Serializable {
// [...]
private static ClassLoader classLoaderForImport = ParentData.class.getClassLoader();
// [...]
public static void setClassLoaderForImport(ClassLoader classLoaderForImport) {
ParentData.classLoaderForImport = classLoaderForImport;
}
// [...]
public static Lumicon importFromXMLFile(String path) {
return importFromFile(new DomDriver(), path);
}
private static ParentData importFromFile(HierarchicalStreamDriver driver, String path) {
try {
XStream xstream = new XStream(driver);
//set the classloader as the default one won't work in any case
xstream.setClassLoader(ParentData.classLoaderForImport);
xstream.alias("ParentData", classLoaderForImport.loadClass(ParentData.class.getName()));//ParentData.class);
xstream.alias("ChildData", classLoaderForImport.loadClass(ChildData.class.getName()));//ChildData.class);
Reader reader = new FileReader(path);
Object object = xstream.fromXML(reader);
return (ParentData) object;
} catch (ClassNotFoundException ex) {
System.out.println("This did not work.");
} catch (FileNotFoundException e) {
System.out.println("File " + path + " not found.");
}
}
// [...]
}
Функция xstream.fromXML(reader)
не работает, но classLoaderForImport.loadClass(ChildData.class.getName())
не провалится.
Это, как я называю это из другого Bundle:
ParentData.setClassLoaderForImport(ParentData.class.getClassLoader());
data = ParentData.importFromXMLFile(path); // this is where the Exception happens
Я также попытался this.getClass().getClassLoader()
и ChildData.class.getClassLoader()
Может быть, что это не работает, потому что эта функция вызывается из третьего пучка ?
Некоторые больше информации:
- Java версия: 1.4 (нет, я не могу обновить до 1.5 или 1.6)
- среды выполнения: J2SE-1,6
- Maven Версия: 2.2.1
- Бег с Пакс Runner (1.5.0) из OPS4J - http://www.ops4j.org
- OSGi: Equinox 3.6.0
- XStream 1.3.1 (com.springsource.com.thoughtworks.xstr eam)
Любая помощь была бы очень желанной!
«Не удалось вызвать ParentData.readObject()« Существует ли этот метод? Если да, увидим ли это? – biziclop
В сообщении об ошибке также есть странная вещь, может быть опечатка, но, возможно, подсказка: «Невозможно найти класс ChildDat ** e **» в исходном сообщении (но не о причине-сообщении, как ни странно). – biziclop
@biziclop 1. readObject() не существует. Это была проблема. 2. Да, это была опечатка –