Как справиться с ошибкой кодека MongoDB при декодировании унаследованных списков обобщенных списков в Java? - PullRequest
2 голосов
/ 17 июня 2019

Я получаю следующую ошибку при попытке десериализации объекта, содержащего универсальный List<List<T>>:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.lang.Object

Я обнаружил, что исключение выдается при попытке десериализации спискаОднако, если я изменю поле на List<T>, оно будет работать.Пожалуйста, смотрите код ниже.

У меня есть следующие Java pojos (с геттерами и сеттерами):

public class A<T> {
    private List<List<T>> values;
}

public class B extends A<Float>{
    @BsonId
    private Integer id;
}

Мой клиент MongoDB настроен со следующим реестром кодеков:

CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
        fromProviders(PojoCodecProvider.builder()
            .conventions(Collections.singletonList(Conventions.ANNOTATION_CONVENTION))
            .automatic(true)
            .build()));

Когда я изменяю классы на следующую структуру, все работает:

public class A<T> {
    private List<T> values;
}


public class B extends A<List<Float>>{
    @BsonId
    private Integer id;
}

Я ожидаю, что Mongo будет поддерживать Generics на любом уровне, но вместо этого я получаю следующую трассировку стека:

Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.lang.Object.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37)
    at org.bson.codecs.pojo.FallbackPropertyCodecProvider.get(FallbackPropertyCodecProvider.java:38)
    at org.bson.codecs.pojo.PropertyCodecRegistryImpl.get(PropertyCodecRegistryImpl.java:44)
    at org.bson.codecs.pojo.CollectionPropertyCodecProvider.get(CollectionPropertyCodecProvider.java:37)
    at org.bson.codecs.pojo.PropertyCodecRegistryImpl.get(PropertyCodecRegistryImpl.java:44)
    at org.bson.codecs.pojo.CollectionPropertyCodecProvider.get(CollectionPropertyCodecProvider.java:37)
    at org.bson.codecs.pojo.PropertyCodecRegistryImpl.get(PropertyCodecRegistryImpl.java:44)
    at org.bson.codecs.pojo.PojoCodecImpl.addToCache(PojoCodecImpl.java:211)
    at org.bson.codecs.pojo.PojoCodecImpl.specialize(PojoCodecImpl.java:80)
...