私は、play フレームワーク、jongo、および MongoDB を使用してプロジェクトに取り組み始めました。このプロジェクトは最初、@Id と @ObjectId の両方で注釈が付けられた String id フィールドを持つ pojo を使用して Play 2.1 で作成されました。 .
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;
}
}
MongoDB に永続化された POJO は、RoboMongo 経由で表示すると、次のようになります。
{
"_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"}
どんな助けでも大歓迎です!:)