web-dev-qa-db-ja.com

@RequestParamと@RequestBodyを使用したSpring @ GetMappingは、HttpMessageNotReadableExceptionで失敗します

エンドポイントへの要求は、次のエラーで失敗します。

400不正なリクエストorg.springframework.http.converter.HttpMessageNotReadableException:必要なリクエスト本文がありません

@GetMapping
public List<SomeObject> list(@RequestParam(required = false) String parameter, @RequestBody String body, @RequestHeader("Authorization") String token) {
.....
}

@GetMapping@PostMappingに変更された場合でも、すべてが魅力のように機能します。一体何が起こっているのか考えはありますか?

注: Swaggerはリクエストの送信に使用されるため、エラーがCurlにある可能性はほとんどありません。

PDATE:したがって、Springは@RequestBodyに対して@GetMappingをサポートしていないようです。私はまだ理由を理解できませんか? @DeleteMapping with @RequestBodyは正常に機能し、HTTP/1.1によると、GETリクエストには本文が含まれる可能性があります--stackoverflow.com/questions/978061/http-get-with-request-body

IMO DELETEで本文を許可するのは少し矛盾しているように見えますが、GETでは禁止しています

5
Ilya Buziuk

@RequestBodyアノテーションは、(POST/PUT)リクエスト本文で送信されたコンテンツをアノテーション付き変数にバインドします。 GETリクエストには「body」の部分がないため、Springは同じことを示すためにHttpMessageNotReadableExceptionをスローします。

原則として、「body」コンテンツを含むことができるリクエストには、@RequestBodyのみを使用できます。 POSTまたはPUT。

11
Kedar Joshi

今日、spring-webmvc 5.1.5で同様の問題に遭遇し、ライブラリコードを確認しました。 HttpMessageNotReadableExceptionは、readWithMessageConvertersを呼び出してnullになったため、_RequestResponseBodyMethodProcessor.readWithMessageConverters_からスローされました。リクエストContent-Type(for (HttpMessageConverter<?> converter : this.messageConverters))に適したコンバーターを検索するreadWithMessageConvertersにループがあり、リクエストでContent-Typeを指定しなかったため、失敗しました。

そこで、ヘッダー_Content-Type: application/json_を指定して、問題を解決しました。

0
ersteLicht