Conversión hacia atrás de Mongo ObjectId de JSON a POJO
en mi base de datos tengo un usuario con ObjectId ("5f78cd195a52a201fb117175") .
Luego lo envío por Spring REST Controller a Angular Frontend y allí mi ID de objeto se ve así: {date: 1601752345000, timestamp: 1601752345} Luego, en la interfaz, creo el objeto del producto, que contiene el campo userId cuyo valor está establecido en {date: 1601752345000, timestamp: 1601752345} . Ese objeto se envía al backend y luego se guarda en db. El problema es que cuando lo convierte el controlador Jackson en Rest, el campo userId tiene el valor ObjectId ("5f78cd19065ece5ade441e7a") .
Entonces, del usuario con ObjectId ("5f78cd195a52a201fb117175") recibo ObjectId ("5f78cd19065ece5ade441e7a") No tengo un usuario con este segundo ObjectId, por lo que el campo con userId no contiene ninguna relación con el usuario real.
¿Sabes por qué sucede y cómo afrontarlo?
Respuestas
Jacksontrata todos los objetos como POJOtipos. De forma predeterminada, serializa todas las getter-s. Supongamos que esa ObjectIdinstancia en Javaestá representada por org.bson.types.ObjectId que tiene dos getter-s:
- getDate en el
datecampo de su caso enJSON - getTimestamp en su
timestampcampo de caso enJSON
Estos dos campos se serializarán para la JSONcarga útil. El proceso de deserialización necesita constructor y establecedores. Supongo que, en este caso, se elegirá el constructor ObjectId (int timestamp, int counter) (pero no estoy seguro). Puede intentar crear una nueva instancia de ObjectIduso de este constructor con valores de su JSONcarga útil.
Cuando utiliza Jacksonpara serializar / deserializar tipos de bibliotecas de terceros, puede esperar que haya un módulo implementado para esto. Eche un vistazo a MongoJack :
Dado que MongoDB usa BSON, una forma binaria de JSON, para almacenar sus documentos, un mapeador JSON es un mecanismo perfecto para mapear objetos Java a documentos MongoDB. Y el mejor mapeador JSON de Java es Jackson. ...
Debe registrar este módulo y los procesos de serialización / deserialización deberían funcionar como se esperaba.
Ver también:
- ¿Cómo se extrae una marca de tiempo de un ObjectId de MongoDB en Spring Data MongoDB?
- JSON binario con bson4jackson