Existen las siguientes opciones para que funcione.
Por subclases
Si subclasifica con un tipo genérico concreto cada vez, funciona:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Usando BsonDocument
+ Jackson
Para evitar la creación de subclases, puede intentar almacenar objetos arbitrarios como BsonDocument
-s y serializarlos/deserializarlos 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);
}
}
Esto funciona hasta que evite la convención de getters/setters para withValue()
y value()
métodos, de lo contrario, Mongo comienza a quejarse del mismo problema de genéricos.
Lo mismo con bson puro
Creo que también puedes intentar hacerlo igual que arriba usando org.bson.codecs.pojo.PojoCodec
que puede crear o extraer del registro actual de códecs de mongo. Si lo sabe de antemano y le da la clase real, no debería quejarse de los genéricos.