1. ホーム
  2. spring

[解決済み] コンテンツタイプ 'application/x-www-form-urlencoded;charset=UTF-8' は @RequestBody MultiValueMap ではサポートされていません。

2022-06-22 15:11:10

質問

回答に基づく Springの@Controllerでx-www-form-urlencodedを使用した場合の問題に対して

以下の@Controllerメソッドを書きました。

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
            , produces = {"application/json", "application/xml"}
            ,  consumes = {"application/x-www-form-urlencoded"}
    )
     public
        @ResponseBody
        Representation authenticate(@PathVariable("email") String anEmailAddress,
                                    @RequestBody MultiValueMap paramMap)
                throws Exception {


            if(paramMap == null || paramMap.get("password") == null) {
                throw new IllegalArgumentException("Password not provided");
            }
    }

へのリクエストは以下のようなエラーで失敗します。

{
  "timestamp": 1447911866786,
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path": "/users/usermail%40gmail.com/authenticate"
}

[追記: 天竺はずっとフレンドリーでしたが、ここでの実用的な制限を考えると今は使えませんでした] 。

どのように解決するのですか?

この問題は application/x-www-form-urlencoded を使ったとき、SpringはこれをRequestBodyとして理解しないことです。ですから、もし私たちがこの を削除しなければなりません。 @RequestBody アノテーションを削除する必要があります。

では、以下を試してみてください。

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
        produces = {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody  Representation authenticate(@PathVariable("email") String anEmailAddress, MultiValueMap paramMap) throws Exception {
   if(paramMap == null && paramMap.get("password") == null) {
        throw new IllegalArgumentException("Password not provided");
    }
    return null;
}

アノテーションを削除したことに注意してください。 リクエストボディ

回答 : Springでコンテンツタイプapplication/x-www-form-urlencodedのHttp Postリクエストが機能しない。