Java 我可以对Post请求使用@Requestparam注释吗?
我有一个控制器方法:Java 我可以对Post请求使用@Requestparam注释吗?,java,spring,spring-mvc,spring-web,Java,Spring,Spring Mvc,Spring Web,我有一个控制器方法: @PostMapping( value = "/createleave", params = {"start","end","hours","username"}) public void createLeave(@RequestParam(value = "start") String start, @RequestParam(value = "end") String end,
@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);
}
但是,当我向该端点发送post请求时,我得到以下结果
"{"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"}"
当我从@PostMapping
注释中删除params参数时,我得到一个更一般的错误,它会说它找不到第一个必需的参数(start),而实际上它是与参数end、hours和username一起发送的
我在这篇文章中读到,@RequestParam
只能用于get方法,但是如果我删除@RequestParam
并坚持使用@PostMapping
注释的params参数,它仍然不起作用。我知道我可以使用@RequestBody
,但我不想只为这4个参数创建一个类。有人能告诉我怎样才能做到这一点吗
多谢各位
编辑:我在这里读到,参数params并不是我想象的那样。它似乎被用作一种条件。如果一组参数与某个值匹配,那么端点控制器方法将被激活。您所要求的根本错误。POST请求在正文负载中发送数据,正文负载通过
@RequestBody
映射@RequestParam
用于通过URL参数映射数据,如/URL?start=foo
。您试图做的是使用@RequestParam
执行@RequestBody
的工作
REST控制器的替代解决方案
- 介绍一个DTO类。这是最首选和最干净的方法
- 如果确实希望避免创建类,则可以使用
。确保在您的请求头中包含@RequestBody-Map-payload
'Content-Type':'application/json'
- 如果确实要使用
,请改用GET请求并通过URL参数发送数据@RequestParam
- 引入DTO类并将其与注释一起使用
@modeldattribute
- 如果将表单数据转换为JSON,则可以使用
。要执行此操作,请参阅@RequestBody-Map-payload
无法将表单数据编码数据直接映射到
映射
您应该使用@RequestBody
而不是使用@RequestParam
您应该将整个对象作为请求体提供
@RequestParam
用于从URL获取数据
你可以这样做
public-saveUser(@RequestBody-User-User){用User做点什么}
它将被映射为用户对象,例如@PostMapping(“/createleave”)
@PostMapping("/createleave")
public void createLeave(@RequestParam Map<String, String> requestParams){
String start = requestParams.get("start");
String end= requestParams.get("end");
String hours= requestParams.get("hours");
String username = requestParams.get("username");
System.out.println("Entering createLeave " + start + " " + end + " " + hours + " " + username);
}
public void createLeave(@RequestParam Map requestParams){
String start=requestParams.get(“start”);
String end=requestParams.get(“end”);
String hours=requestParams.get(“hours”);
字符串username=requestParams.get(“用户名”);
System.out.println(“输入createLeave”+开始+“”+结束+“”+小时数+“”+用户名);
}
这是针对多部分/表单数据enctype post请求的。好吧,我认为@Synch的答案从根本上是错误的,而不是要问的问题
@RequestParam
,希望获得或发布HTTP消息,我想说的是,它工作得非常好李>
paramname=paramvalue
键值映射(参见此处)李>
docs.spring.io
,spring文档的官方来源,它:
在SpringMVC中,“请求参数”映射到查询参数,形成
多部分请求中的数据和部分
@RequestParam
注释与@Controller
类的方法参数一起使用,只要该方法由@RequestMapping
进行请求映射,并且您不需要对象,这是完全合法的,没有任何问题。public void createLeave(@RequestParam映射requestParams)
public void createLeave(@RequestParam Map<String, String> requestParams)
上面的代码不起作用
正确的语法是:
public void createLeave(@RequestBody Map<String, String> requestParams)
public void createLeave(@RequestBody-Map-requestParams)
这将把请求映射到一个映射,从错误消息和您发布的代码判断,代码与异常不匹配。您的理解是错误的。您可以对任何类型的请求使用
@RequestParam
。@RequestBody
是如果您发布一个主体(JSON、XML等)如果你只想使用参数,那么@RequestBody
是非常无用的。但是绑定到一个对象应该优先于单独的参数,为此你应该使用@modeldattribute
。其他人说@RequestParam
不能用于post请求。他们是这样认为的ng…(写了三本关于这个主题的书,我很确定我知道我在说什么:)。参数是参数,与将其发送到服务器的方法无关。它们甚至可以用于在发布表单时获取表单参数。现在,如果您要发送JSON,这将是一个不同的故事,因为它是一个主体,应该使用@RequestBody
进行解析。那么,在上面的示例中使用@RequestParam时,为什么会出现错误?我应该换什么才能让它工作?亲爱的,我会选择第二种选择。谢谢你@RequestBody
只在您实际发送有效负载时有用,而表单编码(如JSON或XML)对于简单的表单post@RequestBody
将不起任何作用,然后您必须使用@modeldattribute
或使用@RequestParam
来获取表单参数。如上所述,@RequestParam
不限于获取方法。@同步当我使用第二个选项时,我获取了一条读取HTTP消息失败的:org.springframework.HTTP.converter.HttpMessag