Conversão reversa do Mongo ObjectId de JSON para POJO

Oct 28 2020

em meu banco de dados, tenho um usuário com ObjectId ("5f78cd195a52a201fb117175") .

Então eu o envio pelo Spring REST Controller para Angular Frontend e lá meu id de objeto fica assim: {date: 1601752345000, timestamp: 1601752345} Depois no frontend eu crio o objeto produto, que contém o campo userId cujo valor é definido como {date: 1601752345000, timestamp: 1601752345} . Esse objeto é enviado para o backend e posteriormente salvo no banco de dados. O problema é que quando é convertido por Jackson no controlador Rest, o campo userId tem o valor ObjectId ("5f78cd19065ece5ade441e7a") .

Portanto, do usuário com ObjectId ("5f78cd195a52a201fb117175") eu recebo ObjectId ("5f78cd19065ece5ade441e7a") e não tenho usuário com este segundo ObjectId, portanto, o campo com userId não contém nenhuma relação com o usuário real.

Você sabe por que isso acontece e como lidar com isso?

Respostas

1 MichałZiober Oct 28 2020 at 21:52

Jacksontrata todos os objetos como POJOtipos. Por padrão, serializa todos os getter-s. Vamos supor que essa ObjectIdinstância em Javaseja representada por org.bson.types.ObjectId que tem dois getter-s:

  • getDate no datecampo do seu caso emJSON
  • getTimestamp no timestampcampo do seu caso emJSON

Esses dois campos serão serializados para JSONcarga útil. O processo de desserialização precisa de construtor e configuradores. Acho que, neste caso, o construtor ObjectId (int timestamp, int counter) será escolhido (mas não tenho certeza). Você pode tentar criar uma nova instância ObjectIdusando este construtor com valores de sua JSONcarga útil.

Quando você usa Jacksonpara serializar / desserializar tipos de bibliotecas de terceiros, pode esperar que haja um módulo implementado para isso. Dê uma olhada no MongoJack :

Como o MongoDB usa BSON, uma forma binária de JSON, para armazenar seus documentos, um mapeador JSON é um mecanismo perfeito para mapear objetos Java para documentos MongoDB. E o melhor mapeador Java JSON é Jackson. ...

Você precisa registrar este módulo e os processos de serialização / desserialização devem funcionar conforme o esperado.

Veja também:

  • Como você extrai um carimbo de data / hora de um ObjectId do MongoDB no Spring Data MongoDB?
  • JSON binário com bson4jackson