発生した問題
- 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
の挙動が何らか悪さをしているようです。