MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mappage POJO efficace vers/depuis Java Mongo DBObject à l'aide de Jackson

Vous pouvez probablement utiliser les annotations Mixin pour annoter votre POJO et le BasicDBObject (ou DBObject ), les annotations ne sont donc pas un problème. Depuis BasicDBOject est une carte, vous pouvez utiliser @JsonAnySetter sur la méthode put.

m_objectMapper.addMixInAnnotations(YourMixIn.class, BasicDBObject.class);

public interface YourMixIn.class {
    @JsonAnySetter
    void put(String key, Object value);
}

C'est tout ce que je peux trouver puisque je n'ai aucune expérience avec MongoDB Object.

Mise à jour : MixIn sont essentiellement un mécanisme de Jackson pour ajouter des annotations à une classe sans modifier ladite classe. C'est une solution idéale lorsque vous n'avez pas le contrôle sur la classe que vous souhaitez marshaler (comme lorsqu'elle provient d'un fichier jar externe) ou lorsque vous ne voulez pas encombrer vos classes avec des annotations.

Dans votre cas ici, vous avez dit que BasicDBObject implémente la Map interface, de sorte que la classe ait la méthode put , tel que défini par l'interface de la carte. En ajoutant @JsonAnySetter à cette méthode, vous dites à Jackson que chaque fois qu'il trouve une propriété qu'il ne connaît pas après introspection de la classe, il doit utiliser la méthode pour insérer la propriété dans l'objet. La clé est le nom de la propriété et la valeur est, eh bien, la valeur de la propriété.

Tout cela combiné fait disparaître la carte intermédiaire, puisque Jackson convertira directement en BasicDBOject car il sait maintenant comment désérialiser cette classe de Json. Avec cette configuration, vous pouvez faire :

DBObject dbo = m_objectMapper.convertValue(pojo, BasicDBObject.class);

Notez que je n'ai pas testé cela car je ne travaille pas avec MongoDB, il peut donc y avoir des détails. Cependant, j'ai utilisé le même mécanisme pour des cas d'utilisation similaires sans aucun problème. YMMV selon les classes.