java - 如何通过通用类从 MongoDB 检索 POJO

标签 java mongodb caching reflection gson

我是 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/

相关文章:

java - Apache 速度 : Is there a standard way of verifying the correctness of a template from the command line?

javascript - 有没有办法限制 Meteor aldeed 表格包中发布的字段

ruby-on-rails - 停止在 Rails 和浏览器中缓存图像?

javascript - jQuery 自动完成与 java 自定义数据并显示存储值

java - Java 中的内存泄漏。如何清除列表?

c# - 如何使用具有 native JSON 标准语法的 MongoDB C# 驱动程序发出查找命令?

c++ - 动态分配将数据存储在堆中的随机位置?

缓存的 Apache proxypass IP 地址

java - Spring/JTA/JPA 单元测试 : Rollback not working

arrays - 如何使用 Node.js 驱动程序在 mongoDB 中多次插入数组?