MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb java:classe Perist POJO com campo genérico


Existem as seguintes opções para fazê-lo funcionar.

Por subclasses


Se você subclasse com tipo genérico concreto toda vez, funciona:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}

Usando BsonDocument + Jackson


Para evitar subclasses, você pode tentar armazenar objetos arbitrários como BsonDocument -s e serialize/desserialize-os 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);
  }
}

Isso funciona até que você evite a convenção getters/setters para withValue() e value() métodos, caso contrário, o Mongo começa a reclamar do mesmo problema de genéricos.

O mesmo com bson puro


Eu acho que você também pode tentar fazer o mesmo que acima usando org.bson.codecs.pojo.PojoCodec que você pode criar ou extrair do registro de codecs mongo atual. Se você sabe com antecedência e dá a verdadeira aula, não deve reclamar dos genéricos.