Pranay Nailwal
Pranay Nailwal

Reputation: 542

Spring Boot: MongoDb: Exception: NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(java.lang.Object)

Prologue:

I have researched this topic from the stackoverflow answers. All answers were pointed towards the dependency conflict, which in my case doesn't seem to be true. (if i am not missing anything)

Problem:

I am getting this exception during runtime when i use the MongoTemplate implementation save or insert

mongoTemplate.save(saveObject, COLLECTION)
mongoTemplate.insert(insertObject, COLLECTION)

There are no build issues or compilation issues. The save or insert methods internally call MongoCollection<TDocument>.insertOne(TDocument doc) for my use case. If I implement this like below, it works fine :

MongoCollection<Document> collection = mongoTemplate.getCollection(COLLECTION);
collection.insertOne(docToSave);

Debug:

Also, If i put a debug point at org.springframework.data.mongodb.core.MongoTemplate

collectionToUse.insertOne(dbDoc);//exception is thrown from here

and execute it manually from the debugger, it works!

So there is no way that the Implementation is missing and judging from the gradle dependencies map, there seems to be no conflict as well.

here is my dependency structure:

+--- org.springframework.integration:spring-integration-mongodb -> 5.4.5
|    +--- org.springframework.integration:spring-integration-core:5.4.5
|    |    +--- org.springframework:spring-aop:5.3.5 (*)
|    |    +--- org.springframework:spring-context:5.3.5 (*)
|    |    +--- org.springframework:spring-messaging:5.3.5
|    |    |    +--- org.springframework:spring-beans:5.3.5 (*)
|    |    |    \--- org.springframework:spring-core:5.3.5 (*)
|    |    +--- org.springframework:spring-tx:5.3.5
|    |    |    +--- org.springframework:spring-beans:5.3.5 (*)
|    |    |    \--- org.springframework:spring-core:5.3.5 (*)
|    |    +--- org.springframework.retry:spring-retry:1.3.1
|    |    \--- io.projectreactor:reactor-core:3.4.4
|    |         \--- org.reactivestreams:reactive-streams:1.0.3
|    \--- org.springframework.data:spring-data-mongodb:3.1.6
|         \--- org.springframework.data:spring-data-commons:2.4.6
+--- org.mongodb:mongo-java-driver:3.12.9

gradle file:

//project sensitive configurations omiited
..
//


plugins {
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'war'
}

//project sensitive configurations omiited
..
//

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.mongodb', module: 'mongodb-driver-core'
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
    implementation group: 'javax.servlet', name: 'javax.servlet-api'
    providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.44'
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') {
        exclude group: 'org.mongodb', module: 'mongodb-driver-core'
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
    providedRuntime group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
    implementation('org.springframework.integration:spring-integration-mongodb') {
        exclude group: 'org.mongodb', module: 'mongodb-driver-core'
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
    implementation 'org.mongodb:mongo-java-driver:3.12.9'
    implementation 'org.apache.httpcomponents:httpclient:4.4'
    implementation('com.jayway.jsonpath:json-path:2.0.0') {
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
    implementation 'javax.mail:mail:1.4'
    implementation 'com.googlecode.json-simple:json-simple:1.1.1'
    implementation 'org.reflections:reflections:0.9.9-RC1'
    implementation 'commons-logging:commons-logging:1.2'
    implementation 'commons-fileupload:commons-fileupload:1.3.1'
    implementation 'commons-io:commons-io:2.4'
    implementation 'com.jayway.jsonpath:json-path-assert:0.8.1'
    implementation 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
    implementation 'org.json:json:20141113'
    implementation 'org.apache.poi:poi:3.15'
    implementation 'org.apache.xmlbeans:xmlbeans:3.0.2'
    implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
    implementation 'org.apache.poi:poi-ooxml:3.15'
    implementation 'com.auth0:java-jwt:2.1.0'
    implementation 'net.sf.jxls:jxls-reader:1.0.6'
    implementation 'com.efsavage.jquery:jquery-maven:1.7.2'
    implementation('cglib:cglib:2.2.2') {
        exclude group: 'asm', module: 'asm'
    }
    implementation('org.springframework:spring-mock:2.0.8')
            {
                exclude group: 'org.slf4j', module: 'slf4j-simple'
                exclude group: 'org.slf4j', module: 'slf4j-api'
            }
    implementation 'xerces:xercesImpl:2.11.0'
    implementation 'com.google.guava:guava:18.0'
    implementation 'org.apache.commons:commons-lang3:3.4'
    implementation 'info.cukes:cucumber-picocontainer:1.2.2'
    implementation 'info.cukes:cucumber-junit:1.2.2'
    implementation 'info.cukes:cucumber-java:1.2.2'
    implementation 'javax:javaee-web-api:7.0'

    //project sensitive configurations omiited
    ..
    //
}


//project sensitive configurations omiited
..
//

Exception:

2021-22-07 13:16:03 [http-nio-8081-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] -
                Servlet.service() for servlet [dispatcherServlet] in context with path [/MY_ROOT_PATH] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: 'com.mongodb.client.result.InsertOneResult com.mongodb.client.MongoCollection.insertOne(java.lang.Object)'] with root cause
java.lang.NoSuchMethodError: 'com.mongodb.client.result.InsertOneResult com.mongodb.client.MongoCollection.insertOne(java.lang.Object)'
    at org.springframework.data.mongodb.core.MongoTemplate.lambda$saveDocument$18(MongoTemplate.java:1505)
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:561)
    at org.springframework.data.mongodb.core.MongoTemplate.saveDocument(MongoTemplate.java:1492)
    at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1428)
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:1370)
    at com.company.package.dao.mongo.MyDAOImpl.appendAndSave(MyDAOImpl.java:78)
    at com.company.package.dao.mongo.MyDAOImpl.saveFile(MyDAOImpl.java:50)

Upvotes: 2

Views: 5081

Answers (1)

Pranay Nailwal
Pranay Nailwal

Reputation: 542

Removing spring-integration-mongodb and mongo-java-driver and using just spring-boot-starter-data-mongodb fixed the issue! I think it's safe to assume that spring is looking for a compatible org.mongodb:mongo-driver-sync implementation. However, I would like to hear other's opinion on this one.

FYI, spring-boot-starter-data-mongodb brings down all the implementations the project required, including the implementations from org.mongodb:mongo-java-driver as org.mongodb:mongo-driver-sync.

the changed build.gradle :

//project sensitive configurations omitted
...
//

plugins {
    //project sensitive configurations omitted
    ..
    //
    id 'org.springframework.boot' version '2.4.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'war'
}

//project sensitive configurations omitted
...
//

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
    implementation group: 'javax.servlet', name: 'javax.servlet-api'
    providedRuntime group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.44'
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') {
        exclude group: 'org.slf4j', module: 'slf4j-simple'
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
    providedRuntime group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb'


    // omitted unrelated dependencies for readability
    ...
    //

    //project sensitive configurations omitted
    ...
    //

}

//project sensitive configurations omitted
...
//

Upvotes: 3

Related Questions