web-dev-qa-db-ja.com

JsonMappingException:START_OBJECTトークンからJava.lang.Integerのインスタンスをデシリアライズできません

私は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]

8
user2581426

明らかに、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属性を削除する必要があります。

11
Ali Dehghani

おそらく、Postmanクライアントまたは次のようなものから、本文にJSONテキストを含むリクエストを送信しようとしている可能性があります。

{
 "userId": 3
}

これは整数ではないため、ジャクソンによって逆シリアル化することはできません(そうですが、そうではありません)。 Java.lang IntegerのIntegerオブジェクトはもう少し複雑です。

Postmanが機能するように要求するには、単に(中括弧{}なしで)を入力します。

3
2