我是Mongo的新手,我正在尝试使用它在我们的应用程序内部实现缓存。我们有一个定义的缓存接口(公共缓存(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做些什么吗?我可以用反射做些什么吗? (我没有绑定到GSON或任何其他库,这只是我目前的尝试)。
谢谢, 艾伦
答案 0 :(得分:1)
如果您可以将类类型与对象一起保存到数据库中,则可以使用以下内容推断出正确的类:
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>