Baseado na resposta para problema com o formato x-www-urlencoded com Spring @Controller
Escrevi abaixo o 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");
}
}
o pedido que falha com o erro abaixo indicado
{
"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 era muito mais amigável, mas não podia'não podia usá-lo agora dadas as restrições práticas aqui].
O problema é que quando utilizamos application/x-www-form-urlencoded, a Spring não't a entende como um RequestBody. Portanto, se quisermos usar isto devemos remover a anotação @RequestBody.
Depois tente o seguinte:
@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;
}
Note que removeu a anotação **@RequestBody***
Parece que agora pode simplesmente marcar o parâmetro do método com @RequestParam
e ele fará o trabalho por si.
@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
//work with Map
}
Adicione um cabeçalho ao seu pedido para definir o tipo de conteúdo da aplicação/json
curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY
desta forma, a Primavera sabe como analisar o conteúdo.