2011-02-03 1 views
1

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!

+1

"Impossible d'appeler ParentData.readObject()" Cette méthode existe-t-elle? Si c'est le cas, pouvons-nous le voir? – biziclop

+0

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

+0

@biziclop 1. readObject() n'existe pas. C'était le problème. 2. Oui, c'était une faute de frappe –

Répondre

1

En supposant que votre question contient tout le code concerné, le problème est donnés par ce qui suit:

Could not call ParentData.readObject() 

Vous avez déclaré que votre ParentData implements Serializable. Bien que l'interface Serializable n'inclut aucune méthode, la sérialisation Java et XStream attendent readObject et writeObject. Je suis un peu rouillé sur les situations exactes dans lesquelles ils sont obligatoires, mais je vous suggère de supprimer le implements Serializable de la classe ParentData.

+0

C'était assez facile, je ne le savais pas sur Serializable.Maintenant je me sens bête: P –

Questions connexes