MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb java :classe Perist POJO avec champ générique

Il existe les options suivantes pour le faire fonctionner.

Par sous-classement

Si vous sous-classez avec un type générique concret à chaque fois, cela fonctionne :

public class MyClassCacheEntity extends CacheEntity<MyClass> {}

En utilisant BsonDocument + Jackson

Pour éviter le sous-classement, vous pouvez essayer de stocker des objets arbitraires en tant que BsonDocument -s et sérialisez/désérialisez-les en utilisant 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);
  }
}

Cela fonctionne jusqu'à ce que vous évitiez la convention getters/setters pour withValue() et value() méthodes, sinon Mongo commence à se plaindre du même problème de génériques.

Idem avec le bson pur

Je pense que vous pouvez également essayer de le faire comme ci-dessus en utilisant org.bson.codecs.pojo.PojoCodec que vous pouvez créer ou extraire du registre actuel des codecs mongo. Si vous le savez à l'avance et lui donnez la vraie classe, il ne devrait pas se plaindre des génériques.