MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Effizientes POJO-Mapping zu/von Java Mongo DBObject mit Jackson

Sie können wahrscheinlich Mixin-Anmerkungen verwenden, um Ihr POJO und das BasicDBObject zu kommentieren (oder DBObject ), Anmerkungen sind also kein Problem. Seit BasicDBOject eine Karte ist, können Sie @JsonAnySetter verwenden auf der Put-Methode.

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

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

Das ist alles, was mir einfällt, da ich keinerlei Erfahrung mit MongoDB Object habe.

Aktualisierung: MixIn sind im Grunde ein Jackson-Mechanismus, um einer Klasse Anmerkungen hinzuzufügen, ohne diese Klasse zu ändern. Dies ist eine perfekte Lösung, wenn Sie keine Kontrolle über die Klasse haben, die Sie marshallen möchten (z. B. wenn sie aus einem externen JAR stammt) oder wenn Sie Ihre Klassen nicht mit Anmerkungen überladen möchten.

In Ihrem Fall hier sagten Sie, dass BasicDBObject implementiert die Map Schnittstelle, sodass diese Klasse die Methode put hat , wie von der Kartenschnittstelle definiert. Durch Hinzufügen von @JsonAnySetter zu dieser Methode sagen Sie Jackson, dass er immer dann, wenn er eine Eigenschaft findet, die er nach der Selbstprüfung der Klasse nicht kennt, die Methode verwenden soll, um die Eigenschaft in das Objekt einzufügen. Der Schlüssel ist der Name der Eigenschaft und der Wert ist, nun ja, der Wert der Eigenschaft.

All dies zusammen lässt die Zwischenkarte verschwinden, da Jackson direkt in das BasicDBOject konvertiert weil es jetzt weiß, wie diese Klasse von Json deserialisiert wird. Mit dieser Konfiguration können Sie:

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

Beachten Sie, dass ich dies nicht getestet habe, da ich nicht mit MongoDB arbeite, daher könnte es einige lose Enden geben. Ich habe jedoch den gleichen Mechanismus für ähnliche Anwendungsfälle ohne Probleme verwendet. YMMV abhängig von den Klassen.