我刚刚开始使用 play 框架、jongo 和 MongoDB 开展一个项目。该项目最初是在 Play 2.1 中编写的,带有带有注释的字符串 id 字段的 pojos:@Id 和 @ObjectId 这将作为 ObjectId 持续存在于 Mongo 中,并且在反序列化时会将 id 输出为:“id”:“53fcb9ede4b0b18314098d10”例如.
由于升级到 Jongo 1.1 和 Play 2.3.3 id 属性在反序列化时始终命名为“_id”,我希望该属性保留字段名称但我不能使用 @JsonProperty("custom_name") 作为 Jongo @Id 注释@JsonProperty("_id") 在幕后做。
import org.jongo.marshall.jackson.oid.Id;
import org.jongo.marshall.jackson.oid.ObjectId;
public class PretendPojo {
@Id
@ObjectId
private String id;
private String name;
public PretendPojo() {
}
public PretendPojo(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
如果我通过 RoboMongo 查看 POJO,则在 MongoDB 中持久化时的 POJO 看起来像这样
{
"_id" : ObjectId("53fc984de4b0c34f1905b8ee"),
"name" : "Owen"
}
但是,当我反序列化它们时,如果我保留两个注释,我会得到以下 json:
{"name":"Owen","_id":{"time":1409072858000,"date":1409072858000,"timestamp":1409072858,"new":false,"timeSecond":1409072858,"inc":308487737,"machine":-458223042}}
如果我只使用 @Id 注释,则以下输出。
{"name":"Owen","_id":"53fcbedae4b0123e12632639"}
我有一个使用上面的 PretendPojo 显示的测试用例:
@Test
public void testJongoIdDeserialization() throws UnknownHostException {
DB database = new MongoClient("localhost", 27017).getDB("jongo");
Jongo jongo = new Jongo(database);
MongoCollection collection = jongo.getCollection("jongo");
collection.save(new PretendPojo("Owen"));
PretendPojo pretendPojo = collection.findOne("{name: \"Owen\"}").as(PretendPojo.class);
JsonNode json = Json.toJson(pretendPojo);
assertNotNull(json.get("id"));
}
当尝试使用自定义反序列化器时,我永远无法获得对象 ID,我似乎只能访问当前正在反序列化的日期/时间/时间戳数据。
理想情况下,我正在寻找的输出是:
{"name":"Owen","id":"53fcbedae4b0123e12632639"}
任何帮助将不胜感激!:)