Существуют следующие варианты, чтобы заставить его работать.
Подклассами
Если вы каждый раз создаете подкласс с конкретным универсальным типом, это работает:
public class MyClassCacheEntity extends CacheEntity<MyClass> {}
Используя BsonDocument
+ Джексон
Чтобы избежать создания подклассов, вы можете попытаться сохранить произвольные объекты как BsonDocument
-s и сериализовать / десериализовать их, используя Джексона:
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);
}
}
Это работает до тех пор, пока вы не будете избегать соглашения о методах получения / установки для методов withValue()
и value()
, в противном случае Mongo начнет жаловаться на ту же проблему обобщений.
То же самое с чистым bson
Я думаю, вы также можете попробовать сделать то же самое, что и выше, используя org.bson.codecs.pojo.PojoCodec
, который вы можете либо создать, либо извлечь из текущего реестра кодеков монго. Если вы знаете заранее и даете ему реальный класс, он не должен жаловаться на генерики.