2016-05-26 9 views
0

Springブートを使用して、小さく簡単なRESTサービスを作成したいと考えました。ここ は、RESTサービスのコードは次のとおりです。JsonMappingException:java.lang.IntegerのインスタンスをSTART_OBJECTトークンからデシリアライズできません

@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 WARN [XNIO-2タスク-7] .wsmsDefaultHandlerExceptionResolver:HTTP を読み取れませんでしたメッセージ: org.springframework.http.converter.HttpMessageNotReadableExc例: ドキュメントを読み取れませんでした: のインスタンスを逆シリアル化できません。java.lang.Integerが[ソース: のSTART_OBJECTトークンから抜けています。java.io.PushbackInputStream @ 12e7333c;行:1、列:1]; 例外はcom.fasterxml.jackson.databind.JsonMappingExceptionです。 は、[ソース:[email protected];のSTART_OBJECT トークンからjava.lang.Integerのインスタンスを非直列化できません。行:1、 コラム:1]

答えて

3

明らかジャクソンはIntegerに渡されたJSONをデシリアライズすることはできません。あなたが要求本体を通ってユーザーのJSON表現を送信するために主張する場合は、次のように別のBeanでuserIdをカプセル化する必要があります

public class User { 
    private Integer userId; 
    // getters and setters 
} 

その後、あなたのハンドラメソッドの引数としてそのBeanを使用します。

@RequestMapping(...) 
public @ResponseBody Record getRecord(@RequestBody User user) { ... } 

別のBeanを作成するオーバーヘッドが嫌いな場合は、の一部としてuserIdをパス変数に渡すことができます。 /getuser/15。ためにそれを行うには:あなたは、もはやリクエストボディにJSONを送信しないので、あなたはそのconsumes属性を削除する必要があり

@RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json") 
public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... } 

+1

私は問題がJackson Object Mapperであることを知っていますが、HTTP経由で送信するJSONオブジェクトは実際にはわかりません。私の元々の話は、私のJSONオブジェクトに問題があるということでした。 お返事ありがとうございましたAli Dehghani! – user2581426

+0

PathVariableアノテーションを使用せずに単純なIntegerをPOSTメソッドで送信する他の方法はありませんか? 要求本体に単純な整数を逆シリアル化できる他のデシリアライズ・テクニックはありますか? – user2581426

+0

'application/json'ではなく、キーと値のペアを送ることができます。 'application/x-www-form-urlencoded'を使用してリクエスト本体の' userId = 15' –

関連する問題