Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以对Post请求使用@Requestparam注释吗?_Java_Spring_Spring Mvc_Spring Web - Fatal编程技术网

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'
  • 如果确实要使用
    @RequestParam
    ,请改用GET请求并通过URL参数发送数据
MVC控制器的替代解决方案
  • 引入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消息,我想说的是,它工作得非常好
  • POST消息的数据有效负载(body)是指投票最多的答案(同样是@Synch),它实际上是文本数据,在法律上完全可以是
    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