diff --git a/bson/src/main/org/bson/codecs/pojo/FallbackPropertyCodecProvider.java b/bson/src/main/org/bson/codecs/pojo/FallbackPropertyCodecProvider.java index 8c5fd4e9cf3..1084dbf0eb2 100644 --- a/bson/src/main/org/bson/codecs/pojo/FallbackPropertyCodecProvider.java +++ b/bson/src/main/org/bson/codecs/pojo/FallbackPropertyCodecProvider.java @@ -19,6 +19,10 @@ import org.bson.codecs.Codec; import org.bson.codecs.configuration.CodecRegistry; +import java.lang.reflect.Type; +import java.util.List; +import java.util.stream.Collectors; + final class FallbackPropertyCodecProvider implements PropertyCodecProvider { private final CodecRegistry codecRegistry; private final PojoCodec pojoCodec; @@ -35,6 +39,10 @@ public Codec get(final TypeWithTypeParameters type, final PropertyCode if (clazz == pojoCodec.getEncoderClass()) { return (Codec) pojoCodec; } + List types = type.getTypeParameters().stream().map(TypeWithTypeParameters::getType).collect(Collectors.toList()); + if (!types.isEmpty()) { + return codecRegistry.get(type.getType(), types); + } return codecRegistry.get(type.getType()); } } diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoCodecCyclicalLookupTest.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoCodecCyclicalLookupTest.java index 161a54fd902..0d1ad79df96 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoCodecCyclicalLookupTest.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoCodecCyclicalLookupTest.java @@ -31,6 +31,7 @@ import org.bson.codecs.pojo.entities.SimpleModel; import org.junit.jupiter.api.Test; +import java.lang.reflect.Type; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -136,9 +137,19 @@ static class LookupCountingCodecRegistry implements CodecRegistry { @Override public Codec get(final Class clazz) { + return get(clazz, this); + } + + @Override + public Codec get(final Class clazz, final List typeArguments) { + return get(clazz, typeArguments, this); + } + + @Override + public Codec get(final Class clazz, final CodecRegistry registry) { incrementCount(clazz); for (CodecProvider provider : codecProviders) { - Codec codec = provider.get(clazz, this); + Codec codec = provider.get(clazz, registry); if (codec != null) { return codec; } @@ -146,10 +157,11 @@ public Codec get(final Class clazz) { return null; } - public Codec get(final Class clazz, final CodecRegistry registry) { + @Override + public Codec get(final Class clazz, final List typeArguments, final CodecRegistry registry) { incrementCount(clazz); for (CodecProvider provider : codecProviders) { - Codec codec = provider.get(clazz, registry); + Codec codec = provider.get(clazz, typeArguments, registry); if (codec != null) { return codec; }