Conversion vers l'arrière Mongo ObjectId de JSON à POJO

Oct 28 2020

dans ma base de données, j'ai un utilisateur avec ObjectId ("5f78cd195a52a201fb117175") .

Ensuite, je l'envoie par Spring REST Controller à Angular Frontend et mon identifiant d'objet ressemble à ceci: {date: 1601752345000, timestamp: 1601752345} Ensuite, dans le frontend, je crée un objet produit, qui contient le champ userId dont la valeur est définie sur {date: 1601752345000, timestamp: 1601752345} . Cet objet est envoyé au backend et est enregistré ultérieurement dans la base de données. Le problème est que lorsqu'il est converti par Jackson dans le contrôleur Rest, le champ userId a la valeur ObjectId ("5f78cd19065ece5ade441e7a") .

Donc, de la part de l'utilisateur avec ObjectId ("5f78cd195a52a201fb117175") je reçois ObjectId ("5f78cd19065ece5ade441e7a") Je n'ai pas d'utilisateur avec ce second ObjectId donc le champ avec userId ne contient aucune information à l'utilisateur réel.

Savez-vous pourquoi cela se produit et comment y faire face?

Réponses

1 MichałZiober Oct 28 2020 at 21:52

Jacksontraite tous les objets comme des POJOtypes. Par défaut, sérialise tous les getter-s. Supposons que cette ObjectIdinstance dans Javaest représentée par org.bson.types.ObjectId qui a deux getter-s:

  • getDate dans votre datechamp de cas dansJSON
  • getTimestamp dans votre timestampchamp de cas dansJSON

Ces deux champs seront sérialisés en JSONcharge utile. Le processus de désérialisation nécessite un constructeur et des setters. Je suppose que dans ce cas, le constructeur ObjectId (int timestamp, int counter) sera choisi (mais je ne suis pas sûr). Vous pouvez essayer de créer une nouvelle instance d' ObjectIdutilisation de ce constructeur avec les valeurs de votre JSONcharge utile.

Lorsque vous utilisez Jacksonpour sérialiser / désérialiser des types à partir de bibliothèques tierces, vous pouvez vous attendre à ce qu'un module soit implémenté pour cela. Jetez un œil sur MongoJack :

Étant donné que MongoDB utilise BSON, une forme binaire de JSON, pour stocker ses documents, un mappeur JSON est un mécanisme parfait pour mapper des objets Java sur des documents MongoDB. Et le meilleur mappeur Java JSON est Jackson. ...

Vous devez enregistrer ce module et les processus de sérialisation / désérialisation devraient fonctionner comme prévu.

Voir également:

  • Comment extraire un horodatage d'un ObjectId MongoDB dans Spring Data MongoDB?
  • JSON binaire avec bson4jackson