MongoDB Kotlin Driver问题:ObjectId无序列化器致序列化失败
解决MongoDB Kotlin Driver数据类序列化ObjectId的问题
问题原因
kotlinx.serialization默认不支持MongoDB的ObjectId类型,即便添加@Contextual注解,若未配置对应序列化器或引入正确依赖,仍会抛出序列化器找不到的异常。
解决方案
1. 确保依赖配置正确
先确认项目中引入MongoDB Kotlin序列化扩展及kotlinx.serialization相关依赖:
Gradle Kotlin DSL配置:
plugins { kotlin("jvm") version "1.9.20" // 匹配你的Kotlin版本 kotlin("plugin.serialization") version "1.9.20" } dependencies { // MongoDB Kotlin驱动(同步/异步版本二选一) implementation("org.mongodb:mongodb-kotlin-driver-sync:4.11.1") // MongoDB Kotlin序列化扩展 implementation("org.mongodb.kotlin:mongodb-kotlin-serialization:4.11.1") // kotlinx.serialization核心库 implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") }
Maven配置:
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-kotlin-driver-sync</artifactId> <version>4.11.1</version> </dependency> <dependency> <groupId>org.mongodb.kotlin</groupId> <artifactId>mongodb-kotlin-serialization</artifactId> <version>4.11.1</version> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-serialization-json</artifactId> <version>1.6.3</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>1.9.20</version> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> <configuration> <plugins> <plugin> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-serialization-maven-plugin</artifactId> <version>1.6.3</version> </plugin> </plugins> </configuration> </execution> </executions> </plugin> </plugins> </build>
2. 修正数据类注解
使用MongoDB官方提供的@MongoId注解替代@Contextual,该注解会自动关联ObjectId的序列化器,无需手动配置:
import org.bson.types.ObjectId import org.mongodb.kotlin.mongoId.MongoId import kotlinx.serialization.Serializable import kotlinx.serialization.SerialName @Serializable data class Word( @SerialName("_id") @MongoId val id: ObjectId, val pos: String, val word: String, val hyphenation: String? = null, val related: List<String>? = null, val derived: List<String>? = null, val senses: List<Sense>, val forms: VerbConjugation?, val searchSet: Set<String> ) // 必须给所有嵌套自定义类添加@Serializable注解 @Serializable data class Sense(/* 你的字段定义 */) @Serializable data class VerbConjugation(/* 你的字段定义 */)
3. (可选)手动注册序列化器方案
若需保留@Contextual注解,需手动将MongoDB提供的ObjectIdSerializer注册到kotlinx.serialization的序列化模块中:
import org.bson.types.ObjectId import org.mongodb.kotlin.serialization.ObjectIdSerializer import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable import kotlinx.serialization.SerialName import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule // 注册ObjectId序列化器 val customJson = Json { serializersModule = SerializersModule { contextual(ObjectId::class, ObjectIdSerializer()) } } // 使用@Contextual的实体类 @Serializable data class Word( @SerialName("_id") @Contextual val id: ObjectId, // 其他字段... )
注意:使用此方案时,需在MongoDB客户端配置中指定该自定义Json序列化器。
关键注意点
- 所有嵌套的自定义数据类(如
Sense、VerbConjugation)必须添加@Serializable注解,否则会触发序列化异常。 - 确保Kotlin版本与kotlinx.serialization插件版本一致,避免版本兼容性问题。
内容的提问来源于stack exchange,提问作者Shazniq
相关产品推荐
相关产品推荐

