杰克逊在OSGi环境中反序列化自定义类

时间:2013-11-01 09:48:36

标签: osgi jackson classloader

我在OSGi环境中使用Jackson 2.1时遇到一些麻烦,当以这种方式反序列化类时:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

class User {
  public Class clazz = org.example.MyClass.class;
}

因为Jackson和我想要反序列化的自定义类不同,所以我经常得到java.lang.ClassNotFoundException - 通常在MyClass1或MyClass2上。

我将其追溯到使用com.fasterxml.jackson.databind.util.ClassUtil来检索用于反序列化的类的类Class.forName(..)。由于OSGI上的类加载器不同,它只能看到JRE和Jackson的类,而不是我的自定义类。

有没有一种简单的方法可以让杰克逊找到所有必需的自定义类(我有几十个),例如添加一个类加载器?

1 个答案:

答案 0 :(得分:2)

作为杰克逊的客户,您可以看到要反序列化的类。诀窍是将这些类传递给杰克逊,而不是强迫杰克逊使用动态反射来找到类。

Jackson documentation表示方法ObjectMapper.readValue可以将Class对象作为其参数。如果你使用这种方法,杰克逊不应该打电话给Class.forName()。文档给出了以下示例:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(new File("user.json"), User.class);

此处,User是您的客户可见但不对杰克逊可见的域类。这个调用应该可以在OSGi中正常工作......如果那么我会建议杰克逊可能有错误。