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
相关产品推荐
相关产品推荐

