Dostępne są następujące opcje, aby to działało.
Przez podklasy
Jeśli za każdym razem tworzysz podklasę z konkretnym typem ogólnym, to działa:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Za pomocą BsonDocument
+ Jackson
Aby uniknąć podklas, możesz spróbować przechowywać dowolne obiekty jako BsonDocument
-s i serializuj/deserializuj je za pomocą Jacksona:
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);
}
}
Działa to, dopóki nie unikniesz konwencji getterów/setterów dla withValue()
i value()
metod, w przeciwnym razie Mongo zacznie narzekać na ten sam problem z lekami generycznymi.
To samo z czystym bsonem
Myślę, że możesz również spróbować zrobić to samo, co powyżej, używając org.bson.codecs.pojo.PojoCodec
które można utworzyć lub wyodrębnić z bieżącego rejestru kodeków mongo. Jeśli wiesz z góry i nadajesz mu prawdziwą klasę, nie powinien narzekać na leki generyczne.