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

如何正确为标注@JsonProperty的Kotlin类设置属性值?

问题核心原因

你当前的代码存在两个问题导致无法实现需求:

  • Product类的主构造函数没有定义productKey参数,无法在实例化时直接传入赋值
  • productKey的set方法被private修饰,外部类没有权限直接修改该属性值

正确实现方案

方案1:保留原有封装逻辑,仅新增构造参数(推荐)

不需要修改private set的封装限制,只要给主构造函数新增可选参数即可:

@Document
open class Product(
  // 新增构造参数,默认值保留原有随机生成逻辑,不影响原有无参实例化的使用
  productKey: KeyClass = KeyClass(UUID.randomUUID())
){
  @Indexed(unique = true)
  @JsonProperty(access = JsonProperty.Access.READ_ONLY)
  var productKey: KeyClass = productKey
    private set
}

对应调用代码修正语法即可(你原有代码缺少闭合括号):

myKey.forEach { item -> 
  updateKey(Product(productKey = item.value)) 
}

方案2:放开属性修改权限(仅适用于需要后续修改productKey的场景)

如果你的业务逻辑需要在实例化后还能修改productKey,可以移除private修饰:

@Document
open class Product(){
  @Indexed(unique = true)
  @JsonProperty(access = JsonProperty.Access.READ_ONLY)
  var productKey: KeyClass = KeyClass(UUID.randomUUID())
    set // 移除private修饰,允许外部调用set方法
}

除了构造传参的写法,你也可以选择先实例化再赋值:

myKey.forEach { item -> 
  val product = Product()
  product.productKey = item.value
  updateKey(product)
}

补充说明

  • @JsonProperty(access = JsonProperty.Access.READ_ONLY)仅作用于Jackson的序列化/反序列化逻辑,不会限制Kotlin代码层面的属性读写,不需要修改该注解。
  • 如果不需要在实例化后修改productKey,建议把var改为val,代码安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:06:07