I have this controller method:
@PostMapping(
value = "/createleave",
params = {"start","end","hours","username"})
public void createLeave(@RequestParam(value = "start") String start,
@RequestParam(value = "end") String end,
@RequestParam(value = "hours") String hours,
@RequestParam(value = "username") String username){
System.out.println("Entering createLeave " + start + " " + end + " " + hours + " " + username);
LeaveQuery newLeaveQuery = new LeaveQuery();
Account account = accountRepository.findByUsername(username);
newLeaveQuery.setAccount(account);
newLeaveQuery.setStartDate(new Date(Long.parseLong(start)));
newLeaveQuery.setEndDate(new Date(Long.parseLong(end)));
newLeaveQuery.setTotalHours(Integer.parseInt(hours));
leaveQueryRepository.save(newLeaveQuery);
}
However when I send a post request to this endpoint I get the following
"{"timestamp":1511444885321,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.UnsatisfiedServletRequestParameterException","message":"Parameter conditions \"start, end, hours, username\" not met for actual request parameters: ","path":"/api/createleave"}"
When I remove the params argument from the @PostMapping
annotation I get a more general error, it will say that it cannot find the first required parameter (start), while it really is being send together with the parameters end, hours and username.
how to get param in method post spring mvc?
I've read in this post that @RequestParam
can only be used for get methods, but if I remove @RequestParam
and stick with the params argument of the @PostMapping
annotation it still doesn't work. I know I can use @RequestBody
but I do not want to make a class just for those 4 parameters. Can anyone tell me how I can make this work?
Thank you
EDIT: I'm reading here https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params-- that the argument params isn't exactly what I thought it was. It seems to be used as a condition. If a set of parameters match a value then the endpoint controller method will be activated.
@RequestParam
with any type of request.@RequestBody
is if you post a body (in JSON, XML etc) and you want it marshaled to an object. If you only want to use parameters then@RequestBody
is pretty much useless. However binding to an object should be preferred over separate parameters and for this you should use@ModelAttribute
. – Papa@RequestParam
cannot be used with post requests – Ravenravening@RequestBody
. – Papa@RequestParam
but the conditions (theparams
in the@RequestMapping
) and as stated I think the code posted here isn't the actual code... – Papa@PathVariable
annotation instead. – Ravenravening