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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:40