Aby to fungovalo, existují následující možnosti.
Podle podtřídy
Pokud pokaždé použijete podtřídu s konkrétním obecným typem, funguje to:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Pomocí BsonDocument
+ Jackson
Chcete-li se vyhnout podtřídění, můžete zkusit uložit libovolné objekty jako BsonDocument
-s a serializovat/deserializovat je pomocí 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);
}
}
Toto funguje, dokud se nevyhnete konvencím getter/setters pro withValue()
a value()
jinak si Mongo začne stěžovat na stejný generický problém.
Totéž s čistým bson
Myslím, že to můžete také zkusit udělat stejně jako výše pomocí org.bson.codecs.pojo.PojoCodec
které můžete buď vytvořit nebo extrahovat z aktuálního registru mongo kodeků. Pokud víte předem a dáte tomu skutečnou třídu, neměl by si stěžovat na generika.