発生した問題
- JSONシリアライズしたい
data classのうち、シリアライズされないプロパティが存在する。
以下のような、data classをResponseに乗せて返却するコントローラーがあります。
@RestController
class JsonTestController {
@GetMapping("jsonTest")
fun jsonTest(): ResponseEntity<HaveBoolean> {
val value = BooleanValue(true)
return ResponseEntity.ok(HaveBoolean(value))
}
data class BooleanValue(val value: Boolean)
data class HaveBoolean(
val isAdmin: BooleanValue,
)
}
こちらを実行(curl http://localhost:8082/jsonTest)すると、空のオブジェクト({})がレスポンスとして返ってきます。本来なら
{"isAdmin":"value"{true}}が返ってきて欲しいのですが。
解決方法
@get:JsonProperty("isXXXX")をプロパティに付与します。
// 上記のコントローラーからHaveBooleanクラスのみ抜粋
data class HaveBoolean(
@get:JsonProperty("isAdmin") //これが必要
val isAdmin: BooleanValue,
)
原因
こちらのページから回答を日本語訳にして引用
これは、kotlinにおけるjacksonの既知の問題です。Jacksonは基本的に名前からisを削除しようとしますが、kotlinのデータクラスの実装はisを含まない適切なゲッターを持っていないため、ミスマッチが生じます。JsonProperty("isAdmin")を変数に追加すれば、動作するはずです。
よくわかっていないですが、data classが暗黙的に持つgetter/setterの命名とJacksonの挙動が何らか悪さをしているようです。