3

我是 Mongo 的新手,正在尝试使用它在我们的应用程序内部实现缓存。我们有一个定义的缓存接口(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 中做些什么?我可以用反射做些什么?(我没有绑定到 GSON 或任何其他库,这只是我目前的尝试)。

谢谢,艾伦

4

1 回答 1

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>
于 2013-10-18T22:18:13.047 回答