Renomeie ObjectId _id para id na desserialização de jackson com Jongo e MongoDB
Acabei de começar a trabalhar em um projeto usando o framework framework, jongo e MongoDB. O projeto foi inicialmente escrito no Play 2.1 com pojos com um campo de ID de seqüência de caracteres anotado com: @Id e @ObjectId Isso persistiria no Mongo como um ObjectId e, quando desserializado, produziria o ID como: "id": "53fcb9ede4b0b18314098d10", por exemplo .
Desde a atualização para o Jongo 1.1 e o Play 2.3.3, o atributo id sempre é chamado "_id" quando desserializado, desejo que o atributo retenha o nome do campo, mas não posso usar @JsonProperty ("custom_name") como a anotação Jongo @Id @JsonProperty ("_ id") nos bastidores.
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;
}
}
Os POJOs quando persistidos no MongoDB ficam assim se eu os visualizar via RoboMongo
{
"_id" : ObjectId("53fc984de4b0c34f1905b8ee"),
"name" : "Owen"
}
No entanto, quando eu desserializá-los, obtenho o seguinte json se eu mantiver as duas anotações:
{"name":"Owen","_id":{"time":1409072858000,"date":1409072858000,"timestamp":1409072858,"new":false,"timeSecond":1409072858,"inc":308487737,"machine":-458223042}}
e a saída a seguir se eu usar apenas a anotação @Id.
{"name":"Owen","_id":"53fcbedae4b0123e12632639"}
Eu tenho um caso de teste para trabalhar com o PretendPojo show acima:
@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"));
}
Ao tentar usar desserializadores personalizados, nunca consigo obter o ID do objeto. Parece que só tenho acesso aos dados de data / hora / carimbo de data / hora que estão sendo desserializados no momento.
Idealmente, a saída que estou procurando seria:
{"name":"Owen","id":"53fcbedae4b0123e12632639"}
Qualquer ajuda será muito apreciada! :)