sql >> Database >  >> NoSQL >> MongoDB

Efficiënte POJO-toewijzing van/naar Java Mongo DBObject met Jackson

U kunt waarschijnlijk Mixin-annotaties gebruiken om uw POJO en het BasicDBObject te annoteren (of DBObject ), dus annotaties zijn geen probleem. Sinds BasicDBOject een kaart is, kunt u @JsonAnySetter . gebruiken op de put-methode.

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

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

Dit is alles wat ik kan bedenken, aangezien ik geen ervaring heb met MongoDB Object.

Bijwerken: MixIn zijn in feite een Jackson-mechanisme om annotaties aan een klasse toe te voegen zonder de klasse te wijzigen. Dit is perfect geschikt als je geen controle hebt over de klas die je wilt rangschikken (zoals wanneer het uit een externe pot komt) of wanneer je je lessen niet wilt overladen met annotaties.

In jouw geval hier zei je dat BasicDBObject implementeert de Map interface, zodat de klasse de methode put . heeft , zoals gedefinieerd door de kaartinterface. Door @JsonAnySetter aan die methode, vertel je Jackson dat wanneer hij een eigenschap vindt die hij niet kent na introspectie van de klasse, hij de methode moet gebruiken om de eigenschap in het object in te voegen. De sleutel is de naam van het onroerend goed en de waarde is, nou ja, de waarde van het onroerend goed.

Dit alles gecombineerd zorgt ervoor dat de tussenliggende kaart verdwijnt, aangezien Jackson direct zal converteren naar het BasicDBOject omdat het nu weet hoe het die klasse van Json moet deserialiseren. Met die configuratie kunt u het volgende doen:

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

Merk op dat ik dit niet heb getest omdat ik niet met MongoDB werk, dus er kunnen wat losse eindjes zijn. Ik heb echter hetzelfde mechanisme gebruikt voor vergelijkbare gebruiksgevallen zonder enig probleem. YMMV afhankelijk van de klassen.



  1. Spring boot mongodb auditing fout

  2. Kaart verminderen uitvoeren mislukt met pymongo maar succes in mongo-shell

  3. pymongo.errors.OperationFailure:niet-ondersteund type in filter

  4. Velden opnemen in mongodb-aggregaat