Ada opsi berikut untuk membuatnya berfungsi.
Dengan membuat subkelas
Jika Anda subkelas dengan tipe generik konkret setiap kali, itu berfungsi:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Dengan menggunakan BsonDocument
+ Jackson
Untuk menghindari subkelas, Anda dapat mencoba menyimpan objek arbitrer sebagai BsonDocument
-s dan membuat cerita bersambung/deserialisasi menggunakan 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);
}
}
Ini berfungsi sampai Anda menghindari konvensi getter/setter untuk withValue()
dan value()
metode, jika tidak, Mongo mulai mengeluh tentang masalah generik yang sama.
Sama dengan bson murni
Saya rasa, Anda juga dapat mencoba melakukan hal yang sama seperti di atas menggunakan org.bson.codecs.pojo.PojoCodec
yang dapat Anda buat atau ekstrak dari registri codec mongo saat ini. Jika Anda tahu sebelumnya dan memberikannya kelas yang sebenarnya, seharusnya tidak mengeluh tentang obat generik.