2020/12/14訂正
私の理解が間違っていました。
なぜか、第3引数で指定する型を、第2引数の型を指定するものだと思っていました。
正確には、第3引数は、戻り値の型を指定するでした。
@PostMapping("/hoge")
fun hoge() : String {
val uri = "foo"
val human = Human("30","Nobkov","male")
// jsonに変換する必要なし
- val mapper = jacksonObjectMapper()
- val json = mapper.writeValueAsString(human)
- val response = restTemplate.postForObject(uri, json, String::class.java) as String
// 「as String」を使わなくても良いが「String?」になっていたので、一応キャスト
+ val response = restTemplate.postForObject(uri, human, String::class.java) as String
return "index"
}
はじめに
どーも、のぶこふです。
タイトル通りですが、だいぶ躓いたので備忘として残しておきます。
(日本語での解決サイトも特に見当たらなかったので)
もう少し詳細に書くと、ACA-PyのCloudAgentのAPIに対して、Webアプリからリクエストを投げたのですが、まーエラーが返ってきて、なんじゃらほい、といった感じです。
Swaggerからだと問題なく動いたのですが、まったく同じJsonを文字列として投げてもダメだったので、RequestHeaderを設定したら、うまく行ったよ。と言うことです。
なにがおこっていたのか?
SpringBoot+Kotlin+JsonでPostをしようとしたら、次のような記述になると思います。
@PostMapping("/hoge")
fun hoge() : String {
val uri = "foo"
val human = Human("30","Nobkov","male")
val mapper = jacksonObjectMapper()
val json = mapper.writeValueAsString(human)
val response = restTemplate.postForObject(uri, json, String::class.java) as String
return "index"
}
data class Human(
@JsonProperty("age")
val age : String = "",
@JsonProperty("name")
val name : String = "",
@JsonProperty("sex")
val sex : String = "",
)
ところがどっこい、これだと次のようなエラーが発生したのです。
422 Unprocessable Entity: [{"age": ["Missing data for required field."],"name": ["Missing data for required field."],"sex": ["Missing data for required field."]}
「いや、設定しとるわっ!!」
なんやかんやありまして
原因としては、受け手がJSONを要求していたからなのかなーと思いつつ、対応方法は次の通りです。
@PostMapping("/hoge")
fun hoge() : String {
val uri = "foo"
val human = Human("30","Nobkov","male")
val mapper = jacksonObjectMapper()
val json = mapper.writeValueAsString(human)
+ // setting header
+ val header = HttpHeader()
+ header.contentType = MediaType.APPLICATION_JSON
+ val entity = HttpEntity(json, header)
+ val response = restTemplate.postForObject(uri, entity, String::class.java) as String
- val response = restTemplate.postForObject(uri, json, String::class.java) as String
return "index"
}
おわりに
やっぱり、調べ物しているより、コード書いているのが良い。
今回はここまでです。
ありがとうございました。
参考