Spring Boot: MongoDb: Exception: NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(java.lang.Object)
Spring Boot: MongoDb: Exception: NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(java.lang.Object)
序言:
我已经从 Whosebug 的答案中研究了这个主题。所有答案都指向依赖冲突,在我看来这似乎不是真的。 (如果我没有遗漏任何东西)
问题:
当我使用 MongoTemplate
实现 save
或 insert
时,我在 运行时 期间遇到此异常
mongoTemplate.save(saveObject, COLLECTION)
mongoTemplate.insert(insertObject, COLLECTION)
没有构建问题或编译问题。
save
或 insert
方法在我的用例内部调用 MongoCollection<TDocument>.insertOne(TDocument doc)
。如果我像下面这样实现它,它就可以正常工作:
MongoCollection<Document> collection = mongoTemplate.getCollection(COLLECTION);
collection.insertOne(docToSave);
调试:
此外,如果我将调试点放在 org.springframework.data.mongodb.core.MongoTemplate
collectionToUse.insertOne(dbDoc);//exception is thrown from here
并从调试器手动执行它,成功了!
所以不可能缺少实现,从gradle dependencies
映射来看,似乎也没有冲突。
这是我的依赖结构:
+--- 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 文件:
//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
..
//
异常:
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(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)
删除 spring-integration-mongodb
和 mongo-java-driver
并仅使用 spring-boot-starter-data-mongodb
解决了问题!我认为可以安全地假设 spring 正在寻找兼容的 org.mongodb:mongo-driver-sync
实现。但是,我想听听其他人对此的看法。
仅供参考,
spring-boot-starter-data-mongodb
降低了项目所需的所有实现,包括来自 org.mongodb:mongo-java-driver
的实现,如 org.mongodb:mongo-driver-sync
。
改变了 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
...
//
序言:
我已经从 Whosebug 的答案中研究了这个主题。所有答案都指向依赖冲突,在我看来这似乎不是真的。 (如果我没有遗漏任何东西)
问题:
当我使用 MongoTemplate
实现 save
或 insert
mongoTemplate.save(saveObject, COLLECTION)
mongoTemplate.insert(insertObject, COLLECTION)
没有构建问题或编译问题。
save
或 insert
方法在我的用例内部调用 MongoCollection<TDocument>.insertOne(TDocument doc)
。如果我像下面这样实现它,它就可以正常工作:
MongoCollection<Document> collection = mongoTemplate.getCollection(COLLECTION);
collection.insertOne(docToSave);
调试:
此外,如果我将调试点放在 org.springframework.data.mongodb.core.MongoTemplate
collectionToUse.insertOne(dbDoc);//exception is thrown from here
并从调试器手动执行它,成功了!
所以不可能缺少实现,从gradle dependencies
映射来看,似乎也没有冲突。
这是我的依赖结构:
+--- 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 文件:
//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
..
//
异常:
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(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)
删除 spring-integration-mongodb
和 mongo-java-driver
并仅使用 spring-boot-starter-data-mongodb
解决了问题!我认为可以安全地假设 spring 正在寻找兼容的 org.mongodb:mongo-driver-sync
实现。但是,我想听听其他人对此的看法。
仅供参考,
spring-boot-starter-data-mongodb
降低了项目所需的所有实现,包括来自 org.mongodb:mongo-java-driver
的实现,如 org.mongodb:mongo-driver-sync
。
改变了 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
...
//