如何通过泛型类从MongoDB检索POJO



我是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 方法上获取类型,不理想但有效),我可以让它工作,但我无法弄清楚如何让它适用于列表。 例如,一个 ArrayList <Long>最终会成为 ArrayList <Double>

有什么建议吗? 我可以在GSON做什么? 我可以用反思做些什么?(我没有绑定到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>

最新更新