@PathVariable @RequestParam @RequestBody等参数绑定注解详解

2023-02-13,,,,

一、分类

handler method 参数绑定常用的注解,我们根据他们处理的Request的内容不同分为四类:

处理request uri 部分的注解:   @PathVariable;(这里指uri template中variable,不含queryString部分)
处理request header部分的注解:   @RequestHeader, @CookieValue;
处理request body部分的注解:@RequestParam,  @RequestBody;
处理attribute类型是注解: @SessionAttributes, @ModelAttribute;

二、主要注解详解

1、@PathVariable

当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

下面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController { @RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}

2、@RequestParam

  用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

RequestParam可以接受简单类型的属性,也可以接受对象类型。常用来处理简单类型的绑定。
提交方式为:GET、POST;
该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm { // ... @RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
} // ...

3、@RequestBody

  该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}

4、@RequestParam,@RequestBody小结

在GET请求中,不能使用@RequestBody。
在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。

举个例子,在SpringMVC配置了HttpMessageConverters处理栈中,指定json转化的格式,如Date转成‘yyyy-MM-dd’,则参数接收对象包含的字段如果是Date类型,就只能让客户端传递年月日的格式,不能传时分秒。因为不同的接口,它的参数可能对时间参数有不同的格式要求,所以这样做会让客户端调用同事对参数的格式有点困惑,所以说扩展性不高。
如果使用@RequestParam来接受参数,可以在接受参数的model中设置@DateFormat指定所需要接受时间参数的格式。
另外,使用@RequestBody接受的参数是不会被Servlet转化统一放在request对象的Param参数集中,@RequestParam是可以的。

综上所述,一般情况下,推荐使用@RequestParam注解来接受Http请求参数。

参考文献:

(1)https://blog.csdn.net/walkerjong/article/details/7946109#

(2)https://www.cnblogs.com/guoyinli/p/7056146.html

@PathVariable @RequestParam @RequestBody等参数绑定注解详解的相关教程结束。

《@PathVariable @RequestParam @RequestBody等参数绑定注解详解.doc》

下载本文的Word格式文档,以方便收藏与打印。