sql >> Base de Datos >  >> NoSQL >> MongoDB

Mapeo eficiente de POJO hacia/desde Java Mongo DBObject usando Jackson

Probablemente pueda usar anotaciones Mixin para anotar su POJO y el BasicDBObject (o DBObject ), por lo que las anotaciones no son un problema. Desde BasicDBOject es un mapa, puede usar @JsonAnySetter en el método put.

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

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

Esto es todo lo que se me ocurre ya que no tengo experiencia con MongoDB Object.

Actualización: MixIn son básicamente un mecanismo de Jackson para agregar anotaciones a una clase sin modificar dicha clase. Esta es una opción perfecta cuando no tiene control sobre la clase que desea organizar (como cuando se trata de un contenedor externo) o cuando no desea saturar sus clases con anotaciones.

En su caso aquí, dijo que BasicDBObject implementa el Map interfaz, por lo que la clase tiene el método put , tal como lo define la interfaz del mapa. Agregando @JsonAnySetter a ese método, le dices a Jackson que cada vez que encuentre una propiedad que no conoce después de la introspección de la clase, use el método para insertar la propiedad en el objeto. La clave es el nombre de la propiedad y el valor es, bueno, el valor de la propiedad.

Todo esto combinado hace que el mapa intermedio desaparezca, ya que Jackson se convertirá directamente al BasicDBOject porque ahora sabe cómo deserializar esa clase de Json. Con esa configuración, puedes hacer:

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

Tenga en cuenta que no he probado esto porque no trabajo con MongoDB, por lo que puede haber algunos cabos sueltos. Sin embargo, he usado el mismo mecanismo para casos de uso similares sin ningún problema. YMMV dependiendo de las clases.