2011-02-03 1 views
1

Я создал некоторые 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)

Любая помощь была бы очень желанной!

+1

«Не удалось вызвать ParentData.readObject()« Существует ли этот метод? Если да, увидим ли это? – biziclop

+0

В сообщении об ошибке также есть странная вещь, может быть опечатка, но, возможно, подсказка: «Невозможно найти класс ChildDat ** e **» в исходном сообщении (но не о причине-сообщении, как ни странно). – biziclop

+0

@biziclop 1. readObject() не существует. Это была проблема. 2. Да, это была опечатка –

ответ

1

Предположим, что ваш вопрос содержит все необходимые кода, проблема отдана следующим:

Could not call ParentData.readObject() 

Вы заявили, что ваш ParentData implements Serializable. Хотя интерфейс Serializable не содержит никаких методов, как Java-сериализация, так и XStream ожидают readObject и writeObject. Я немного ржавый в тех ситуациях, когда они являются обязательными, но я предлагаю вам удалить implements Serializable из класса ParentData.

+0

Это было довольно легко, я не знал этого о Serializable.Теперь я чувствую себя немым: P –