J'ai créé des bundles OSGi. L'un d'entre eux a une fonction pour exporter des données vers XML en utilisant XStream. Cela fonctionne bien. L'importation à nouveau lorsque vous utilisez l'ensemble en tant que bibliothèque et non dans un contexte OSGi fonctionne.La désérialisation de XML à l'aide de XStream ne fonctionne pas dans OSGi (Java 1.4)
Mais si je l'appelle mon importation dans un autre paquet je reçois un « com.thoughtworks.xstream.converters.ConversionException » avec les informations de débogage follwing imprimé:
---- 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
-------------------------------
Je pense qu'il est un problème semblable à celui : XStream and OSGi ou ceci: CannotResolveClassException in OSGi environment
donc j'ai essayé de le résoudre le réglage de la ClassLoader. Mais ça ne marche pas.
parties de ma classe 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.");
}
}
// [...]
}
La fonction xstream.fromXML(reader)
ne fonctionne pas, mais classLoaderForImport.loadClass(ChildData.class.getName())
ne manque pas.
Voici comment je l'appelle d'un autre Bundle:
ParentData.setClassLoaderForImport(ParentData.class.getClassLoader());
data = ParentData.importFromXMLFile(path); // this is where the Exception happens
J'ai aussi essayé this.getClass().getClassLoader()
et ChildData.class.getClassLoader()
pourrait-il que cela ne fonctionne pas, parce que cette fonction est appelée à partir d'un troisième groupe ?
Un peu plus d'info:
- version Java: 1.4 (non, je ne peux pas passer à 1,5 ou 1,6)
- environnement d'exécution J2SE-1.6
- Version Maven: 2.2.1
- Courir avec Pax Runner (1.5.0) de OPS4J - http://www.ops4j.org
- OSGi: Equinox 3.6.0
- XStream 1.3.1 (com.springsource.com.thoughtworks.xstr eam)
Toute aide serait la bienvenue!
"Impossible d'appeler ParentData.readObject()" Cette méthode existe-t-elle? Si c'est le cas, pouvons-nous le voir? – biziclop
Il y a une chose étrange dans le message d'erreur, peut-être une faute de frappe, mais peut-être un indice: "Impossible de trouver la classe ChildDat ** e **" est dans le message original (mais pas le cause-message, étrangement). – biziclop
@biziclop 1. readObject() n'existe pas. C'était le problème. 2. Oui, c'était une faute de frappe –