springspring-mvcmodel-view-controller

Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap


Based on the answer for problem with x-www-form-urlencoded with Spring @Controller

I have written the below @Controller method

@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");
            }
    }

the request to which fails with the below error

{
  "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"
}

[PS: Jersey was far more friendly, but couldn't use it now given the practical restrictions here]


Solution

  • The problem is that when we use application/x-www-form-urlencoded, Spring doesn't understand it as a RequestBody. So, if we want to use this we must remove the @RequestBody annotation.

    Then try the following:

    @RequestMapping(
      path = "/{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;
    }
    

    Note that removed the annotation @RequestBody

    answer: Http Post request with content type application/x-www-form-urlencoded not working in Spring