You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java17+SpringBoot3.2.5调用MongoTemplate.findAll报模块权限错误

解决方案:module java.base does not "opens java.nio.charset" to unnamed module

问题原因

这个错误是Java 17模块系统的权限限制导致的:MongoDB驱动或Spring Data MongoDB执行查询时,需要通过反射访问java.nio.charset包的内部类,但Java 17默认禁止未命名模块(类路径下的传统代码)访问该模块的内部包。

修复步骤

1. 添加JVM启动参数开放反射权限

在应用启动时添加以下JVM参数,允许未命名模块访问目标包:

--add-opens java.base/java.nio.charset=ALL-UNNAMED

不同场景的配置方式:

  • IDE启动:在Run/Debug配置的VM options中直接添加上述参数。
  • Maven构建启动:修改pom.xml中的spring-boot-maven-plugin:
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <jvmArguments>--add-opens java.base/java.nio.charset=ALL-UNNAMED</jvmArguments>
        </configuration>
    </plugin>
    
  • Gradle构建启动:修改build.gradle中的bootRun任务:
    bootRun {
        jvmArgs = ['--add-opens', 'java.base/java.nio.charset=ALL-UNNAMED']
    }
    

2. 修复主类的测试逻辑

你当前主类同时使用AnnotationConfigApplicationContext和SpringApplication.run,会导致上下文初始化不完整,加剧模块权限问题。建议将查询逻辑放到ApplicationRunner中,由Spring Boot统一管理上下文:

@SpringBootApplication
public class FlawlessBeansJavaSpringApiApplication implements ApplicationRunner {

    @Autowired
    private MongoTemplate mongoTemplate;

    public static void main(String[] args) {
        SpringApplication.run(FlawlessBeansJavaSpringApiApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<User> users = mongoTemplate.findAll(User.class);
        // 可添加日志或打印逻辑验证结果
    }
}

3. 确认依赖版本兼容性

Spring Boot 3.2.5对应的Spring Data MongoDB版本为4.2.x,如果你手动指定了依赖版本,建议移除自定义配置,让Spring Boot的依赖管理自动匹配兼容版本。

验证

添加JVM参数并修复主类后,重新启动应用,执行查询时将不再出现模块权限错误。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:27:14