Search code examples
mongodbquarkusquarkus-panache

Quarkus application cannot find codec for MongoDB Clients


Running a quarkus application with MongoDB (Panache) shows warnings on the startup, for example:

WARN  [io.qua.mon.run.MongoClients] (main) Unable to load the property codec provider class org.bson.codecs.pojo.EnumPropertyCodecProvider: java.lang.NoSuchMethodException: org.bson.codecs.pojo.EnumPropertyCodecProvider.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3349)
    at java.base/java.lang.Class.getConstructor(Class.java:2151)
    at io.quarkus.mongodb.runtime.MongoClients.getPropertyCodecProviders(MongoClients.java:440)
    at io.quarkus.mongodb.runtime.MongoClients.configureCodecRegistry(MongoClients.java:332)
    at io.quarkus.mongodb.runtime.MongoClients.createMongoConfiguration(MongoClients.java:255)
    at io.quarkus.mongodb.runtime.MongoClients.createReactiveMongoClient(MongoClients.java:115)
    at io.quarkus.mongodb.runtime.MongoClientRecorder.reactiveMongoClientSupplier(MongoClientRecorder.java:57)
    at io.quarkus.deployment.steps.MongoClientProcessor$generateClientBeans-1756432087.deploy_0(MongoClientProcessor$generateClientBeans-1756432087.zig:96)
    at io.quarkus.deployment.steps.MongoClientProcessor$generateClientBeans-1756432087.deploy(MongoClientProcessor$generateClientBeans-1756432087.zig:40)
    at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:666)
    at io.quarkus.runtime.Application.start(Application.java:101)
    at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:101)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:66)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:42)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:119)
    at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29)

Then on operations to get data from the database (for example find). Generates an StackOverflow exception in a cycle similar to this:

    at org.bson.internal.LazyCodec.encode(LazyCodec.java:38)
    at org.bson.BsonDocumentWrapper.getUnwrapped(BsonDocumentWrapper.java:195)
    at org.bson.BsonDocumentWrapper.entrySet(BsonDocumentWrapper.java:165)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:112)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:42)
    at org.bson.codecs.BsonCodec.encode(BsonCodec.java:55)
    at org.bson.codecs.BsonCodec.encode(BsonCodec.java:33)
    at org.bson.internal.LazyCodec.encode(LazyCodec.java:38)
    at org.bson.BsonDocumentWrapper.getUnwrapped(BsonDocumentWrapper.java:195)
    at org.bson.BsonDocumentWrapper.entrySet(BsonDocumentWrapper.java:165)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:112)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:42)

The mapped objects contains a ObjectId identifier. And those beans are defined in a separate project, there is the jandex plugin to index the beans

The dependecies from Quarkus defined directly on the project POM file are:

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-arc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-mongodb-panache</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-rest-client</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-smallrye-fault-tolerance</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>

Solution

  • I found the issue. By mistake the bson library were added to the jandex index.

    Removing it from the index resolves the issue.

    In our case it was declared on the application properties:

    quarkus.index-dependency.bson.group-id=org.mongodb
    quarkus.index-dependency.bson.artifact-id=bson
    

    I removed those lines, the project works but we see a compilation warning

    [WARNING] [io.quarkus.deployment.steps.ReflectiveHierarchyStep] Unable to properly register the hierarchy of the following classes for reflection as they are not in the Jandex index:
        - org.bson.types.ObjectId (source: RestClientProcessor > com.saaskun.api...)