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

Mongodb java:clase Perist POJO con campo genérico

Existen las siguientes opciones para que funcione.

Por subclases

Si subclasifica con un tipo genérico concreto cada vez, funciona:

public class MyClassCacheEntity extends CacheEntity<MyClass> {}

Usando BsonDocument + Jackson

Para evitar la creación de subclases, puede intentar almacenar objetos arbitrarios como BsonDocument -s y serializarlos/deserializarlos usando Jackson:

public class CacheEntity<V> {
  private String cacheId;
  private BsonDocument rawValue;

  // [...]

  // sets the value
  public void withValue(T o) {
    this.rawValue = BsonDocument.parse(new ObjectMapper().writeValueAsString(o))
  }

  // recovers the value
  public T value(Class<T> clazz) {
    return new ObjectMapper().readValue(this.rawValue.toJson(), clazz);
  }
}

Esto funciona hasta que evite la convención de getters/setters para withValue() y value() métodos, de lo contrario, Mongo comienza a quejarse del mismo problema de genéricos.

Lo mismo con bson puro

Creo que también puedes intentar hacerlo igual que arriba usando org.bson.codecs.pojo.PojoCodec que puede crear o extraer del registro actual de códecs de mongo. Si lo sabe de antemano y le da la clase real, no debería quejarse de los genéricos.