如何正确为标注@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
相关产品推荐
相关产品推荐

