1

I have register codec registry for POJOs as below

@Singleton
public record Repository(MongodbConfiguration mongodbConfiguration) implements IRepository {
    @Override
    public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) {
        // create codec registry for POJOs
        CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
                fromProviders(PojoCodecProvider.builder().automatic(true).build()));

        MongoClientSettings settings = MongoClientSettings.builder().addCommandListener(new MongoCommand()).build();

        MongoClient client = MongoClients.create(settings);

        return client
                .getDatabase(mongodbConfiguration.database())
                .withCodecRegistry(pojoCodecRegistry)
                .getCollection(collectionName, typeParameterClass);
    }
}

When I insert or find some record I get an exception as

Caused by: org.bson.codecs.configuration.CodecConfigurationException: Failed to decode 'CollectionOrProduct'. Decoding 'collection' errored with: Cannot find a public constructor for 'Optional'.
    at org.bson.codecs.pojo.PojoCodecImpl.decodePropertyModel(PojoCodecImpl.java:206)
    at org.bson.codecs.pojo.PojoCodecImpl.decodeProperties(PojoCodecImpl.java:179)
    at org.bson.codecs.pojo.PojoCodecImpl.decode(PojoCodecImpl.java:103)
    at org.bson.codecs.pojo.PojoCodecImpl.decode(PojoCodecImpl.java:107)
    at org.bson.codecs.pojo.LazyPropertyModelCodec.decode(LazyPropertyModelCodec.java:51)
    at org.bson.codecs.DecoderContext.decodeWithChildContext(DecoderContext.java:96)
    at org.bson.codecs.pojo.PojoCodecImpl.decodePropertyModel(PojoCodecImpl.java:200)

I do have a public constructor

@Introspected
public class CollectionOrProduct {
    private Optional<List<SelectOptionModel>> product;
    private Optional<List<SelectOptionModel>> collection;

    public CollectionOrProduct() {
    }

    public CollectionOrProduct(Optional<List<SelectOptionModel>> product, Optional<List<SelectOptionModel>> collection) {
        this.product = product;
        this.collection = collection;
    }
}
San Jaisy
  • 15,327
  • 34
  • 171
  • 290
  • I'm not sure if it will fix your problem, but `Optional` is not designed to be a variable of a POJO. Optional is mostly used as a container around a nullable object returned by methods. – magicmn Oct 20 '21 at 09:32
  • You are right, I found this link for more details https://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555 – San Jaisy Oct 20 '21 at 12:46

0 Answers0