私はSpring Bootを使用して小さくてシンプルなRESTサービスを書きたかった。ここにRESTサービスコード:
@Async
@RequestMapping(value = "/getuser", method = POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Record getRecord(@RequestBody Integer userId) {
Record result = null;
// Omitted logic
return result;
}
送信したJSONオブジェクトは次のとおりです。
{
"userId": 3
}
そして、ここに私が得た例外があります:
警告964 --- [XNIO-2 task-7] .wsmsDefaultHandlerExceptionResolver:HTTPメッセージの読み取りに失敗しました:org.springframework.http.converter.HttpMessageNotReadableException:文書を読み込めませんでした:Java.lang.Integerのインスタンスをデシリアライズできません[ソース:Java.io.PushbackInputStream@12e7333cのSTART_OBJECTトークン。行:1、列:1];ネストされた例外はcom.fasterxml.jackson.databind.JsonMappingExceptionです:[ソース:Java.io.PushbackInputStream@12e7333c;のSTART_OBJECTトークンからJava.lang.Integerのインスタンスをデシリアライズできません。行:1、列:1]
明らかに、Jacksonは渡されたJSONをInteger
にデシリアライズできません。リクエスト本文を通じてserのJSON表現を送信することを要求する場合、次のようにuserId
を別のBeanにカプセル化する必要があります。
public class User {
private Integer userId;
// getters and setters
}
次に、そのBeanをハンドラーメソッドの引数として使用します。
@RequestMapping(...)
public @ResponseBody Record getRecord(@RequestBody User user) { ... }
別のBeanを作成するオーバーヘッドが気に入らない場合は、パス変数の一部としてuserId
を渡すことができます。 /getuser/15
。それを行うには:
@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json")
public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }
リクエスト本文でJSONを送信しなくなったため、そのconsumes
属性を削除する必要があります。
おそらく、Postmanクライアントまたは次のようなものから、本文にJSONテキストを含むリクエストを送信しようとしている可能性があります。
{
"userId": 3
}
これは整数ではないため、ジャクソンによって逆シリアル化することはできません(そうですが、そうではありません)。 Java.lang IntegerのIntegerオブジェクトはもう少し複雑です。
Postmanが機能するように要求するには、単に(中括弧{}なしで)を入力します。
3