Det finns följande alternativ för att få det att fungera.
Genom underklassning
Om du underklassar med konkret generisk typ varje gång, fungerar det:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Genom att använda BsonDocument
+ Jackson
För att undvika underklassning kan du försöka lagra godtyckliga objekt som BsonDocument
-s och serialisera/deserialisera dem med 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);
}
}
Detta fungerar tills du undviker getters/setters-konventionen för withValue()
och value()
metoder, annars börjar Mongo klaga på samma generiska problem.
Samma med ren bson
Jag tror att du också kan försöka göra det på samma sätt som ovan med org.bson.codecs.pojo.PojoCodec
som du antingen kan skapa eller extrahera från det aktuella mongo-codec-registret. Om du vet i förväg och ger den den riktiga klassen, bör den inte klaga på generika.