使用DNS SRV和TXT记录时Spring上下文无法实例化Mongo相关Bean
解决方案
方案1:添加运行期JVM模块导出参数
你之前仅在编译插件中配置了--add-exports参数,仅作用于编译阶段,运行阶段JVM未加载该配置才会报错,根据你的运行场景选择对应配置:
- 如果你使用Spring Boot可执行Jar直接启动:
启动命令新增JVM参数即可:
如需固化到打包配置中,可在java --add-exports jdk.naming.dns/com.sun.jndi.dns=java.naming -jar 你的应用包名.jarspring-boot-maven-plugin添加如下配置:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>--add-exports jdk.naming.dns/com.sun.jndi.dns=java.naming</jvmArguments> </configuration> </plugin> - 如果你是打War包部署到外部Jetty服务器:
编辑Jetty根目录下的start.ini配置文件,新增一行配置后重启Jetty即可:--add-exports=jdk.naming.dns/com.sun.jndi.dns=java.naming
方案2:绕过SRV解析(无需调整JVM参数)
直接将MongoDB连接串从mongodb+srv格式替换为普通mongodb格式,手动填写所有MongoDB节点地址、认证、副本集等参数,无需走SRV记录解析,自然不会触发JNDI相关依赖,示例连接串:
mongodb://用户名:密码@mongo节点1地址:27017,mongo节点2地址:27017,mongo节点3地址:27017/库名?authSource=admin&replicaSet=副本集名称
此前方案无效原因说明
- 新增
jndi.properties无效:报错根因是DnsContextFactory类被Java模块化机制限制访问,并非JNDI配置缺失 - 仅配置编译插件导出参数无效:该参数仅作用于编译期校验,运行期模块化限制仍会拦截类加载
- 升级Jetty版本无效:该问题和Jetty本身无关,是Java 9+模块化的通用限制
内容的提问来源于stack exchange,提问作者SocketM
相关产品推荐
相关产品推荐

