Có các tùy chọn sau để làm cho nó hoạt động.
Theo phân lớp
Nếu bạn phân lớp với kiểu chung cụ thể mỗi lần, nó sẽ hoạt động:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Bằng cách sử dụng BsonDocument
+ Jackson
Để tránh phân lớp con, bạn có thể thử lưu trữ các đối tượng tùy ý dưới dạng BsonDocument
-s và serialize / deserialize chúng bằng cách sử dụng 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);
}
}
Điều này hoạt động cho đến khi bạn tránh được quy ước getters / setters cho withValue()
và value()
, nếu không thì Mongo bắt đầu phàn nàn về cùng một vấn đề chung.
Tương tự với bson thuần túy
Tôi nghĩ, bạn cũng có thể thử làm điều đó tương tự như trên bằng cách sử dụng org.bson.codecs.pojo.PojoCodec
mà bạn có thể tạo hoặc trích xuất từ sổ đăng ký codec mongo hiện tại. Nếu bạn biết trước và cung cấp cho nó một lớp học thực sự, nó không nên phàn nàn về tính chung chung.