背景
最初,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层,所以我确保在业务层中,使用
json
将gson
字符串反序列化到相应的模型中;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和文档中的名称相互匹配,所以应该用一个不复杂的模板引擎来处理它……)