Existem as seguintes opções para fazê-lo funcionar.
Por subclasses
Se você subclasse com tipo genérico concreto toda vez, funciona:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Usando BsonDocument
+ Jackson
Para evitar subclasses, você pode tentar armazenar objetos arbitrários como
BsonDocument
-s e serialize/desserialize-os 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);
}
}
Isso funciona até que você evite a convenção getters/setters para
withValue()
e value()
métodos, caso contrário, o Mongo começa a reclamar do mesmo problema de genéricos. O mesmo com bson puro
Eu acho que você também pode tentar fazer o mesmo que acima usando
org.bson.codecs.pojo.PojoCodec
que você pode criar ou extrair do registro de codecs mongo atual. Se você sabe com antecedência e dá a verdadeira aula, não deve reclamar dos genéricos.