El tipo de contenido 'application/x-www-form-urlencoded;charset=UTF-8' no es compatible con @RequestBody MultiValueMap
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í]
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
Parece que ahora puedes marcar el parámetro del método @RequestParam
y hará el trabajo por ti.
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
//work with Map
}