Er zijn de volgende opties om het te laten werken.
Door subclassificatie
Als je elke keer subklassen met een concreet generiek type, werkt het:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Door BsonDocument
. te gebruiken + Jackson
Om subclassificatie te voorkomen, kunt u proberen willekeurige objecten op te slaan als BsonDocument
-s en serialiseer/deserialiseer ze met 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);
}
}
Dit werkt totdat u getters/setters-conventies voor withValue()
. vermijdt en value()
methoden, anders begint Mongo te klagen over hetzelfde probleem met generieke geneesmiddelen.
Hetzelfde met pure bson
Ik denk dat je hetzelfde kunt proberen als hierboven met org.bson.codecs.pojo.PojoCodec
die u kunt maken of extraheren uit het huidige mongo-codecs-register. Als je het van tevoren weet en het de echte klasse geeft, zou het niet moeten klagen over generieke geneesmiddelen.