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

Kotlin数据类非空字段默认值在Micronaut反序列化时失效问题

解决Micronaut 4.x中Kotlin数据类默认值反序列化NPE问题

问题原因

Micronaut 4.x 默认采用Micronaut Serde作为序列化/反序列化核心框架,而非传统的Jackson。你之前引入的jackson-module-kotlin是Jackson的扩展模块,对Micronaut Serde完全无效。Serde默认不识别Kotlin数据类的默认参数,当JSON中缺失env字段时,会尝试将null传递给非空参数,直接触发空指针异常。

解决方案

方案一:使用Micronaut Serde原生支持(推荐)

这是Micronaut 4的官方推荐方式,步骤如下:

  1. 添加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>
      
  2. 调整数据类注解
    保留@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 = ""
    )
    
  3. 清理无效配置
    删除你之前手动创建的ObjectMapper工厂类,Micronaut Serde会自动处理Kotlin默认参数逻辑。

完成以上步骤后,再发送{"product": "product2"}这类缺失env的JSON请求,env会自动填充为默认空字符串,不会触发NPE。

方案二:切换回Jackson框架(不推荐)

如果必须使用Jackson而非Serde,需要修改配置强制Micronaut使用Jackson:

  1. 在application.yml中禁用Serde并开启Jackson配置

    micronaut:
      serde:
        enabled: false
      jackson:
        serialization:
          write-null-map-values: false
    
  2. 确保Jackson Kotlin模块依赖正确
    保留com.fasterxml.jackson.module:jackson-module-kotlin:2.17.+依赖,Micronaut的Jackson自动配置会自动注册KotlinModule,无需手动创建ObjectMapper。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:43:10