我是 Mongo 的新手,正在尝试使用它在我们的应用程序内部实现缓存。我们有一个已定义的缓存接口(interface)(public Cache(K, V))和几个替代实现(HashTable、JCS 等)。我需要为一些难以(即昂贵)计算数据创建一个 MongoDB 实现。缓存数据将是 POJO 或 POJO 的列表。
我的问题是将 Mongo 响应返回到 POJO 中,或者(到目前为止我还没有想到的)返回到 POJO 列表中。
到目前为止的代码:
public class MongoDBCache<K, V> implements Cache<K, V>
{
private String name = null;
public MongoDBCache(String name)
{
this.name = name;
}
public V get(K key)
{
V result = null;
try
{
DB mdb = getMongoDB();
DBCollection mcol = mdb.getCollection(name);
BasicDBObject query = new BasicDBObject("_id", key.toString());
DBCursor cursor = mcol.find(query);
if (cursor.hasNext())
{
Gson gson = new Gson();
DBObject dbobj = cursor.next();
Class type = ????;
result = (V) gson.fromJson(dbobj.get("obj").toString(), type);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return result;
}
}
如果值只是一个 POJO(可以在 put 方法上获取类型,不理想但可以),我可以使它工作,但我无法弄清楚如何让它为 List 工作。例如,一个 ArrayList <Long>
最终为 ArrayList <Double>
.
有什么建议吗?我可以在 GSON 中做什么?我可以用反射做什么? (我没有绑定(bind)到 GSON 或任何其他库,这只是我目前的尝试)。
谢谢, 艾伦
最佳答案
如果您还可以将您的类类型与对象一起保存到数据库中,您可以使用类似以下内容推断出正确的类:
if (cursor.hasNext())
{
Gson gson = new Gson();
DBObject dbobj = cursor.next();
Class type = Class.forName(dbobj.get("class").toString());
result = (V) gson.fromJson(dbobj.get("obj").toString(), type);
}
你可以用这样的代码得到正确的字符串:
SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();
编辑
请注意,当你想在数据库中存储类类型并且你正在处理泛型时,由于类型删除,你不能这样做:
ArrayList<Long> l = new ArrayList<Long>();
String clazz = l.getClass
因为 clazz
将存储:
java.util.ArrayList
相反,你需要做这样的事情
Type listType = new TypeToken<ArrayList<Long>>() {}.getType();
String clazz = l.getClass();
那会返回给你:
java.util.ArrayList<java.lang.Long>
关于java - 如何通过通用类从 MongoDB 检索 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451834/