Gestion des objets « embedded » dans MongoDB en Java

Lors d’un petit projet personnel récent, j’ai souhaité utiliser le driver Java de MongoDB. Afin de rendre le traitement plus simple à utiliser, je surcharge les différentes méthodes de la classe DBObject avec mes classes de données afin de leur permettre d’être instanciées très rapidement. Cependant, lors de la réalisation des tests unitaires, je me suis rendu compte que les objets inclus dans les documents de la base n’étaient pas récupérés. Voyons pourquoi.

javamongodb

Document JSON

Les exemples de code suivant s’appliquent au document JSON suivant le format :

 

Classes objets

Je travaille sur deux classes principales Directory et Link. Afin de pouvoir utiliser le système de conversion des DBObject, je réalise l’architecture de classes suivante.

Diagramme de classesCette structure est efficace mais il faut implémenter les méthodes héritées de la classe DBObject (put, putAll, get, toMap, removeField, containsField, keyset, markAsPartialObject, isPartialObject). Leur fonctionnement est assez simple et grâce à la fonctionnalité de switch sur les String de Java 7, cela se fait rapidement pour les types primaires et les String. La première problématique était la gestion de la liste de Directory présente dans la classe Directory. Je ne savais pas comment elle allait être gérée. Lors de la récupération des données, le driver crée un objet BasicDBList qui va être confié à la méthode put. Mon premier réflexe est donc de récupérer son contenu et de l’ajouter à un objet ArrayList.

Ci-dessous, le code de la méthode put de la classe Directory avant les tests unitaires.

Liste vide à la lecture de la base

Lors de l’exécution des tests unitaires, je n’ai que des échecs. La sélection d’un document dans la base fonctionne, cependant la liste « directories » est vide. Après passage en Debug, je remarque que l’objet BasicDBList confié à la méthode put est également vide. Ne comprenant pas pourquoi je décide de poster sur le forum officiel de MongoDB. La réponse de Jeff Yemin m’a permis de comprendre pourquoi.

Lorsque le Driver appelle la méthode put avec la liste, celle-ci n’est pas encore remplie. Ainsi le fait de faire une copie du contenu de la liste ne me permet pas de récupérer le contenu qui sera ajouté par la suite à l’objet. Jeff complète sa réponse en m’indiquant que le driver n’est pas assez puissant pour ce genre de manipulation avec les classes Link et Directory. L’objet récupéré sera toujours un BasicDBList contenant des BasicDBObject. Il suggère d’utiliser un Object Document Mapper (ODM) afin de faire la liaison entre mes classes et les documents de MongoDB. Morphia est un de ces ODM. L’utilisation de l’un de ces outils permettrait notamment de ne pas avoir à implémenter DBObject et donc simplifier le travail à réaliser sur les classes Directory et Link.

Ainsi, avec cette solution les classes seraient simplement:

 

La manière dont les listes sont gérées avec le driver de MongoDB est assez particulière et je n’ai trouvé à aucun endroit de documentation expliquant son fonctionnement. Cet article détaille un problème que j’ai rencontré lors de mes développements. J’espère qu’il pourra aider si quelqu’un se trouve dans la même situation.

spacer

Laisser un commentaire