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

Quarkus与MongoDB的Kotlin序列化问题求助

Quarkus + MongoDB + Kotlin 非可变字段序列化问题解决

问题根源

Quarkus的MongoDB客户端基于Mongo Java Driver,反序列化时默认依赖类的无参构造器+字段setter。Kotlin的val字段没有setter,就算配了No-Arg插件生成无参构造器,驱动也没法给val字段赋值,导致查询时roads字段返回null,设为非可空就抛NPE。

解决方案

1. 用构造器注入实现反序列化

给实体类的主构造器加@BsonCreator注解,每个字段用@BsonProperty指定MongoDB里的字段名,让驱动直接通过构造器给val字段赋值:

import org.bson.codecs.pojo.annotations.BsonCreator
import org.bson.codecs.pojo.annotations.BsonProperty

data class RoadMap @BsonCreator constructor(
    @BsonProperty("_id") val id: String?,
    @BsonProperty("roads") val roads: List<Road>,
    // 其他字段按需添加
)

data class Road @BsonCreator constructor(
    @BsonProperty("id") val id: String,
    @BsonProperty("name") val name: String
    // 其他字段按需添加
)

2. 完善No-Arg插件配置

确认构建脚本里的No-Arg插件配置覆盖实体类所在包,同时给实体类加@BsonNoArg注解,保证无参构造器正确生成:

Gradle配置(build.gradle.kts)

plugins {
    kotlin("plugin.noarg") version "你的Kotlin版本号"
}

noArg {
    annotation("org.bson.codecs.pojo.annotations.BsonNoArg")
    invokeInitializers = true
}

实体类加注解

import org.bson.codecs.pojo.annotations.BsonNoArg

@BsonNoArg
data class RoadMap @BsonCreator constructor(...)

3. 原生镜像额外配置(如果需要)

如果要打包成Quarkus原生镜像,在application.properties里添加以下配置,让GraalVM识别相关注解:

quarkus.mongodb.native.additional-annotations=org.bson.codecs.pojo.annotations.BsonCreator,org.bson.codecs.pojo.annotations.BsonProperty

原理说明

  • @BsonCreator告诉Mongo驱动用指定构造器创建实例,直接把数据库字段映射到构造器参数,绕开setter的需求
  • @BsonProperty明确字段映射关系,避免因驼峰/下划线命名差异导致匹配失败
  • No-Arg插件生成的无参构造器是为了满足驱动内部的初始化流程,配合构造器注入就能实现val字段的正常反序列化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:05:09