Kotlin数据类非空字段默认值在Micronaut反序列化时失效问题
问题原因
Micronaut 4.x 默认采用Micronaut Serde作为序列化/反序列化核心框架,而非传统的Jackson。你之前引入的jackson-module-kotlin是Jackson的扩展模块,对Micronaut Serde完全无效。Serde默认不识别Kotlin数据类的默认参数,当JSON中缺失env字段时,会尝试将null传递给非空参数,直接触发空指针异常。
解决方案
方案一:使用Micronaut Serde原生支持(推荐)
这是Micronaut 4的官方推荐方式,步骤如下:
添加Serde Kotlin支持依赖
根据你的构建工具添加对应依赖:- Gradle(Kotlin DSL):
implementation("io.micronaut.kotlin:micronaut-kotlin-serde") - Maven:
<dependency> <groupId>io.micronaut.kotlin</groupId> <artifactId>micronaut-kotlin-serde</artifactId> <scope>compile</scope> </dependency>
- Gradle(Kotlin DSL):
调整数据类注解
保留@Serdeable注解(同时支持序列化和反序列化),无需额外的Jackson模块配置:import io.micronaut.serde.annotation.Serdeable import com.fasterxml.jackson.annotation.JsonInclude @Serdeable @JsonInclude(JsonInclude.Include.NON_NULL) // 仅用于序列化时忽略null,不影响反序列化逻辑 data class PublishRequest( val product: String, val env: String = "" )清理无效配置
删除你之前手动创建的ObjectMapper工厂类,Micronaut Serde会自动处理Kotlin默认参数逻辑。
完成以上步骤后,再发送{"product": "product2"}这类缺失env的JSON请求,env会自动填充为默认空字符串,不会触发NPE。
方案二:切换回Jackson框架(不推荐)
如果必须使用Jackson而非Serde,需要修改配置强制Micronaut使用Jackson:
在
application.yml中禁用Serde并开启Jackson配置micronaut: serde: enabled: false jackson: serialization: write-null-map-values: false确保Jackson Kotlin模块依赖正确
保留com.fasterxml.jackson.module:jackson-module-kotlin:2.17.+依赖,Micronaut的Jackson自动配置会自动注册KotlinModule,无需手动创建ObjectMapper。
内容的提问来源于stack exchange,提问作者tgkprog

