You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SpringBoot对接MongoDB Atlas出现NoSuchMethodError问题求助

解决MongoDB依赖冲突导致的NoSuchMethodError问题

你碰到的这个java.lang.NoSuchMethodError完全是依赖版本不兼容搞出来的问题,我帮你捋清楚怎么解决:

问题根源

Spring Boot的spring-boot-starter-data-mongodb已经内置了适配当前Boot版本的MongoDB Java驱动包,而你手动添加的mongo-java-driver依赖,版本和Boot自带的驱动版本不匹配,导致代码调用insertOne方法时,找不到对应的方法签名(不同版本驱动里这个方法的返回值类型可能有细微变化)。

具体修复步骤

  1. 移除冲突的依赖
    直接删掉pom.xml里你手动加的这段mongo-java-driver依赖:
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.6</version>
</dependency>
  1. (可选)统一驱动版本(如果需要指定版本)
    如果一定要指定MongoDB驱动的版本,不要直接引入驱动包,而是通过Spring Boot的依赖管理来配置。在pom.xml的properties节点里添加:
<properties>
    <java.version>1.8</java.version>
    <mongodb.version>3.11.10</mongodb.version> <!-- 这个版本和Spring Boot 2.3.1.RELEASE完全兼容 -->
</properties>

Spring Boot 2.3.x系列默认适配的是MongoDB驱动3.11.x版本,选这个版本能避免所有兼容性问题。

验证修改后的依赖

修改后你的pom.xml里的dependencies部分应该是这样的:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

额外小提示

你可以用Maven命令mvn dependency:tree查看项目的依赖树,会发现spring-boot-starter-data-mongodb已经引入了mongodb-driver-sync(这是MongoDB 3.11+版本后拆分的新驱动包,替代了旧的mongo-java-driver),所以手动加旧驱动包肯定会冲突。

内容的提问来源于stack exchange,提问作者lovprogramming

火山引擎 最新活动