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

Mongodb java:classe Perist POJO con campo generico

Sono disponibili le seguenti opzioni per farlo funzionare.

Per sottoclasse

Se sottoclassi ogni volta con un tipo generico concreto, funziona:

public class MyClassCacheEntity extends CacheEntity<MyClass> {}

Utilizzando BsonDocument + Jackson

Per evitare la sottoclasse puoi provare a memorizzare oggetti arbitrari come BsonDocument -s e serializzali/deserializzali 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);
  }
}

Funziona finché non eviti la convenzione getter/setter per withValue() e value() metodi, altrimenti Mongo inizia a lamentarsi dello stesso problema con i generici.

Lo stesso con bson puro

Penso che puoi anche provare a farlo come sopra usando org.bson.codecs.pojo.PojoCodec che puoi creare o estrarre dall'attuale registro dei codec mongo. Se lo conosci in anticipo e gli dai la vera classe, non dovrebbe lamentarsi dei generici.