我在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的类,而不是我的自定义类。
有没有一种简单的方法可以让杰克逊找到所有必需的自定义类(我有几十个),例如添加一个类加载器?
答案 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中正常工作......如果不那么我会建议杰克逊可能有错误。