为什么Kotlin中MongoDB连接校验的判空条件被标记为恒为true?
原因说明
1. 为什么IDE提示判空条件恒为true
Kotlin本身对没有空性注解的Java方法返回值会识别为平台类型(Type!),不会默认判定返回值非空。你遇到的警告是JetBrains系列IDE基于内置的第三方库空性元数据给出的判断:
- JetBrains为大量常用Java库维护了额外的外部空性注解,MongoDB Java驱动的
MongoClient.getDatabase()方法已经被官方标记为@NotNull - IDE读取到该注解后,就会判定该方法永远不会返回null,因此你写的
!= null条件恒成立
2. 该方法本身确实不会返回null
就算不依赖外部注解,从MongoDB驱动的设计来看,这个方法也不存在返回null的可能:
- 你贴的接口注释里,返回值描述完全没有提及返回null的场景
- 实际实现中,该方法只有两个分支:参数合法则返回构造好的
MongoDatabase代理对象,参数非法直接抛出IllegalArgumentException,没有返回null的分支
原有连接校验逻辑的问题
你当前的校验逻辑无法判断连接是否活跃:getDatabase只会在客户端本地构造数据库代理对象,不会发起真实的网络请求,哪怕此时MongoDB服务已经断连,这个方法也不会抛出异常,完全达不到校验目的。
正确的连接校验实现
如果要真实校验连接状态,需要调用会实际触发网络请求的方法,比如执行ping命令:
val isConnected: Boolean get() = instance?.connection?.let { conn -> try { conn.getDatabase(instance.databaseName!!).runDocument(org.bson.Document("ping", 1)) true } catch (e: Exception) { Logger.handle("Error verifying mongoDB connection status", e) false } } ?: false
内容的提问来源于stack exchange,提问作者clem585
相关产品推荐
相关产品推荐

