背景
最初,morphia被用来与mongo数据库交互。这很好,工作也很好,但有一个警告…一些映射异常溢出并阻塞日志。See my Unresolved Question on that particular issue然而,经过深思熟虑,因为异常问题没有解决,并且由于MangoDB Java驱动程序3的新特性,我决定从Morphia转移到MunGoB-JavaDRIV3.0(MJD3.0)。
在检查文档(之前由morphia存储)时,我可以看到:

"_id" : ObjectId("55706df5e4b00146ea69622b"),
"className" : "packageName.NewsCategory",
"categoryName" : "Maritime",
"uid" : NumberLong(11),
"createdAt" : ISODate("2015-06-04T15:25:41.096Z"),
"updatedAt" : ISODate("2015-06-04T15:25:41.096Z"),
"active" : true

另外,模型NewsCategory看起来像这样;
public class NewsCategory{
    private ObjectId id;
    private String categoryName;
    private Long uid;
    private Date createdAt;
    private Date updatedAt;
    private boolean active;

    //getters...
    //setters...
}

我的策略
因为我以前使用的是morphia,所以模型(作为pojo)作为属性传递给视图(.vm-velocity模板),在视图中,从字段中读取值为:$!newsCategory.id$!newsCategory.categoryName$!newsCategory.createdAt例如
<a href="/news/categories/$!newsCategory.id"> Edit </a>

现在,因为我不想修改servelet和/或view层,所以我确保在业务层中,使用jsongson字符串反序列化到相应的模型中;
NewsCategory newsCategory = new GsonBuilder().create().fromJson(json, NewsCategory.class);
挑战-1
document类型为org.bson.Document并使用mongodb-java-driver3.0(mjd3.0)时,可以从mongodb正确检索NewsCategory文档,没有问题,并且当我调用
String json = document.toJson();…这里是json结构的样子;
{
    "_id": {
        "$oid": "54ad4568e451500a45f60200"
    },
    "className": "packageName.NewsCategory",
    "categoryName": "General",
    "uid": {
        "$numberLong": "1"
    },
    "createdAt": {
        "$date": 1420641640457
    },
    "updatedAt": {
        "$date": 1429285029337
    },
    "active": true
}

问题
由于格式中存在这些字段类型,使用我前面描述的策略,从json派生的document.toJson()结构无法轻松反序列化到相应的NewsCategory模型。
挑战-2
我使用document直接将gson转换为json,如下所示;
String json = new GsonBuilder().create().toJson(document);…下面是json结构的样子;
{
    "_id": {
        "timestamp": 1420641640,
        "machineIdentifier": 14963024,
        "processIdentifier": 2629,
        "counter": 16122368
    },
    "className": "packageName.NewsCategory",
    "categoryName": "General",
    "uid": 1,
    "createdAt": "Jan 7, 2015 3:40:40 PM",
    "updatedAt": "Apr 17, 2015 4:37:09 PM",
    "active": true
}

这是更理想的方法,我可以使用我通常的策略获得NewsCategory对象;
NewsCategory newsCategory = new GsonBuilder().create().fromJson(json, NewsCategory.class);
不过,还有一个问题
_id字段已被分解为其ObjectId组件,因此无法将id检索为newsCategory.id甚至newsCategory._id
然而,当我以前使用morphia时,只需使用newsCategory.id
主要问题
如何将这些json字符串反序列化为相应的NewsCategory模型,同时仍然确保在使用常规点(.)注释(尤其是id字段)的视图中仍然可以正常访问所有必需的字段?
对于上述挑战1和挑战2的解决方法,我们将不胜感激。
谢谢!
编辑:
我试过@cichystefan的方法,但挑战仍然是如何访问_id字段的值
由于newsCategory现在是org.bson.Document类型,显然原因是,$!newsCategory.id要么是空的,要么是空的,因为当我在google chrome中查看定义为<a href="/news/categories/$!newsCategory.id">的视图中的html部分时,我看到了……<a href="/news/categories/">
现在,本能说通过执行_id来获取$!newsCategory._id部分,但这只是将整个文档作为字符串溢出,并将._id部分附加到字符串的末尾。
<a href="/news/categories/Document{{_id=54ad4568e451500a45f60200, className=packageName.NewsCategory, categoryName=General, uid=1, version=2, createdAt=Wed Jan 07 15:40:40 WAT 2015, updatedAt=Fri Apr 17 16:37:09 WAT 2015, active=true}}._id">

最佳答案

为什么要对json做任何事情?
您不能简单地使用检索到的文档对象(驱动程序已经解析了json来为您准备该对象)并在代码中将其映射到您的pojo吗?
(而且谁知道呢,在很多情况下可能根本不需要转换,因为文档实现了映射,pojo和文档中的名称相互匹配,所以应该用一个不复杂的模板引擎来处理它……)

07-27 13:43