1

在以这种方式反序列化类时,我在 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 的类,但看不到我的自定义类。

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

4

1 回答 1

4

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

Jackson 文档表明该方法可以ObjectMapper.readValueClass对象作为其参数。如果您使用此方法,那么杰克逊应该不需要调用Class.forName(). 文档给出了以下示例:

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

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

于 2013-11-01T12:43:10.410 回答