如何通过Generic Class从MongoDB中检索POJO

时间:2013-10-18 14:12:18

标签: java mongodb caching reflection gson

我是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或任何其他库,这只是我目前的尝试)。

谢谢, 艾伦

1 个答案:

答案 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>