我创建了一些OSGi捆绑包。其中之一具有使用XStream将数据导出到xml的功能。一切正常。当使用Bundle作为库而不是在OSGi上下文中时,也可以再次导入。

但是,如果我在另一个包中调用导入,则会得到“ com.thoughtworks.xstream.converters.ConversionException”,其中包含以下调试信息:

---- 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())不会失败。

这是我从另一个捆绑包中调用的方式:

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
使用OPS4J中的Pax Runner(1.5.0)运行-http://www.ops4j.org
OSGi:Equinox 3.6.0
XStream 1.3.1(com.springsource.com.thoughtworks.xstream)


任何帮助将非常欢迎!

最佳答案

假设您的问题包含所有相关代码,则以下问题将解决该问题:

Could not call ParentData.readObject()


您已声明您的ParentData implements Serializable。尽管Serializable接口不包含任何方法,但是Java序列化和XStream都希望使用readObjectwriteObject。对于强制性的确切情况,我有些不满意,但是我建议您从implements Serializable类中删除ParentData

关于java - 使用XStream反序列化XML在OSGi(Java 1.4)中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4889153/

10-12 16:24