我在 kotlin 项目中有几个数据类:
data class Animation(
val title: String,
val userId: Int,
val height: Int,
val width: Int,
val speed: Int,
val frames: List<Frame>,
val id: Int? = null
) {
fun toJson(): String {
return ObjectMapper().writeValueAsString(this)
}
fun getMeta(): AnimationMeta {
return AnimationMeta(this.id, this.title)
}
}
data class AnimationMeta(val id: Int? = null, val title: String)
我有一个 API 端点,用于通过 id 获取特定动画:
@GetMapping("/{id}")
fun getAnimation(@PathVariable("id") id: Int): Animation {
return animationService.getAnimation(id) ?: throw ResponseStatusException(NOT_FOUND)
}
getAnimation 背后的业务逻辑只是查询数据库,将行映射到动画数据类,然后按原样返回。中间没有什么特别的。
当我实际调用此端点时,由于某种原因,我的序列化响应包括对 getMeta 方法的调用:
GET http://localhost:8080/rest/animations/35
{
"title": "Test",
"userId": 0,
"height": 0,
"width": 0,
"speed": 0,
"frames": [],
"id": 35,
"meta": {
"id": 35,
"title": "Test"
}
}
函数是如何被调用的?我确信这是我在 kotlin 文档中没有看到的一些细节,但我不太明白。
经过一番挖掘,我发现我可以使用 @JsonIgnore 注释来抑制序列化期间的函数调用:
@JsonIgnore
fun getMeta(): AnimationMeta {
return AnimationMeta(this.id, this.title)
}
但我把这个问题留下来,因为我不知道为什么我需要使用这个。我习惯使用它来忽略属性,但我仍然不明白为什么函数调用首先发生。这不像
toJson
函数被调用,那么为什么 getMeta
被调用呢?
如果您不确定是否永久删除您的帐户,您可以先停用它。停用允许您暂时隐藏您的个人资料,如果您改变主意,可以稍后重新激活它。要停用,请转到“设置”>“您的 Facebook 信息”>“帐户所有权和控制”>“停用和删除”>“停用帐户”。