El tipo de contenido 'application/x-www-form-urlencoded;charset=UTF-8' no es compatible con @RequestBody MultiValueMap

Resuelto Somasundaram Sekar asked hace 8 años • 12 respuestas

Basado en la respuesta al problema con x-www-form-urlencoded con Spring @Controller

He escrito el siguiente método @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");
            }
    }

la solicitud que falla con el siguiente 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"
}

[PD: Jersey era mucho más amigable, pero no podía usarlo ahora dadas las restricciones prácticas aquí]

Somasundaram Sekar avatar Nov 19 '15 12:11 Somasundaram Sekar
Aceptado

El problema es que cuando usamos application/x-www-form-urlencoded , Spring no lo entiende como RequestBody. Entonces, si queremos usar esto debemos eliminar la anotación @RequestBody .

Entonces prueba lo siguiente:

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

Tenga en cuenta que se eliminó la anotación @RequestBody

respuesta : La solicitud de publicación Http con tipo de contenido application/x-www-form-urlencoded no funciona en Spring

Douglas Ribeiro avatar Jul 07 '2016 18:07 Douglas Ribeiro

Parece que ahora puedes marcar el parámetro del método @RequestParamy hará el trabajo por ti.

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
  //work with Map
}
scadge avatar Mar 28 '2017 09:03 scadge