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.