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

Kotlin/Micronaut创建@Put端点时JSON反序列化失败求助

Kotlin/Micronaut @Put端点反序列化错误解决思路

问题描述

在为Kotlin/Micronaut应用创建@Put端点时遇到如下错误:

无法解码请求体:为类型[request]解码JSON流时出错:无法构造UpdateGeoTargetsRequest实例(不存在默认构造函数等创建器):无法从对象值反序列化(无委托或基于属性的创建器)。

已尝试操作:

  • 更新项目并添加@Serdeable注解
  • 尝试使用@JsonSerializable/@JsonDeserializable注解,但均无效

相关数据类代码:

data class UpdateGeoTargetsRequest(
    val geoTargets: Array<GeoPoint>
)

解决方法

1. 确认Micronaut Serde依赖配置

Micronaut 3.0+默认采用Micronaut Serde作为JSON序列化工具,而非Jackson。若未正确引入Serde的Kotlin支持依赖,@Serdeable注解无法生效。需在构建文件中添加依赖:

// Gradle Kotlin DSL示例
implementation("io.micronaut.serde:micronaut-serde-kotlin")
annotationProcessor("io.micronaut.serde:micronaut-serde-processor")

2. 正确添加@Serdeable注解

确保注解直接标注在数据类上,同时检查GeoPoint类是否也添加了该注解(嵌套类同样需要序列化支持):

import io.micronaut.serde.annotation.Serdeable

@Serdeable
data class UpdateGeoTargetsRequest(
    val geoTargets: Array<GeoPoint>
)

@Serdeable
data class GeoPoint(
    // 你的GeoPoint字段
)

3. 替换Array为List(推荐方案)

Kotlin的Array类型在JSON序列化时需要额外处理,而List是Serde原生支持的集合类型,适配性更好。修改数据类:

@Serdeable
data class UpdateGeoTargetsRequest(
    val geoTargets: List<GeoPoint>
)

4. 若坚持使用Jackson序列化

如果项目仍依赖Jackson,需添加Jackson Kotlin模块,并启用no-arg插件为数据类生成默认构造函数:

  • 添加依赖:
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  • 启用no-arg插件(Gradle示例):
plugins {
    kotlin("plugin.noarg") version "对应你的Kotlin版本"
}

noArg {
    annotation("com.fasterxml.jackson.annotation.JsonIgnoreProperties")
}
  • 为数据类添加Jackson注解:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties(ignoreUnknown = true)
data class UpdateGeoTargetsRequest(
    val geoTargets: Array<GeoPoint>
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:52:06