MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Efficiente mappatura POJO da/verso Java Mongo DBObject utilizzando Jackson

Probabilmente puoi usare le annotazioni Mixin per annotare il tuo POJO e il BasicDBObject (o DBObject ), quindi le annotazioni non sono un problema. Dal momento che BasicDBOject è una mappa, puoi usare @JsonAnySetter sul metodo put.

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

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

Questo è tutto ciò che posso inventare poiché non ho esperienza con MongoDB Object.

Aggiornamento: MixIn sono fondamentalmente un meccanismo Jackson per aggiungere annotazioni a una classe senza modificare detta classe. Si adatta perfettamente quando non hai il controllo sulla classe di cui vuoi eseguire il marshalling (come quando proviene da un jar esterno) o quando non vuoi ingombrare le tue classi con annotazioni.

Nel tuo caso qui, hai detto che BasicDBObject implementa la Map interfaccia, in modo che la classe abbia il metodo put , come definito dall'interfaccia della mappa. Aggiungendo @JsonAnySetter a quel metodo, dici a Jackson che ogni volta che trova una proprietà che non conosce dopo l'introspezione della classe, usa il metodo per inserire la proprietà nell'oggetto. La chiave è il nome della proprietà e il valore è, beh, il valore della proprietà.

Tutto questo combinato fa sparire la mappa intermedia, poiché Jackson si convertirà direttamente nel BasicDBOject perché ora sa come deserializzare quella classe da Json. Con quella configurazione, puoi fare:

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

Nota che non l'ho testato perché non lavoro con MongoDB, quindi potrebbero esserci dei problemi. Tuttavia, ho utilizzato lo stesso meccanismo per casi d'uso simili senza alcun problema. YMMV a seconda delle classi.