• SpringBoot - @PathVariable/@RequestParam/@RequestBody注解使用详解


    作用是什么?

    @PathVariable/@RequestParam/@RequestBody都是参数注解,用于将请求的参数与方法中的参数进行绑定与映射。

    如何使用?

    1. @PathVariable

    (A). 用于将请求URI中的模板变量,映射到方法的参数上,默认情况下,参数名必须要和路径上的变量名一样,@PathVariable注解允许我们使用value或name属性来给参数取一个别名;

    @GetMapping(value = "/{advertId}")
    public AjaxResult getInfo(@PathVariable("advertId") Long advertId) {...}
    
    // 参数名:userName, 路径上的变量名:name
    @GetMapping("/users/{name}/edit"public String edit(@PathVariable("name") String userName) {...}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (B). 如果参数是可选的,则可以在@PathVariable中设置require = false;

    @GetMapping("/list/exclude/{deptId}")
    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {...}
    
    • 1
    • 2

    (C). 模板变量名需要使用{ }进行包裹,如果方法的参数名与URI模板变量名一致,在@PathVariable中可以省略别名的定义;

    @GetMapping("/info/{username}")
    public R<LoginUser> info(@PathVariable String username) {...}
    
    • 1
    • 2
    2. @RequestParam

    (A). 用于将URI中的请求参数,映射到方法的参数上,如果参数是通过list?id=102&name=rocky传递过来的,可以通过@RequestParam来获取。

    @PostMapping("/logininfor")
    R<Boolean> saveLogininfor(@RequestParam("username") String username, 
    						  @RequestParam("status") String status, 
    						  @RequestParam("message") String message){...}
    
    • 1
    • 2
    • 3
    • 4

    (B). 如果传递的参数为空,可以通过defaultValue设置一个默认值;

    @PostMapping("/logininfor")
    R<Boolean> saveLogininfor(@RequestParam("username") String username, 
    						  @RequestParam(value = "status", defaultValue = "1") String status, 
    						  @RequestParam("message") String message){...}
    
    • 1
    • 2
    • 3
    • 4

    (C). 参数中加或者不加@RequestParam的区别

    // URI上的参数是可选的
    // http://localhost:8080/user01
    // http://localhost:8080/user01?userId=102 这两个请求, getUser01这个方法都能被执行。
    @GetMapping("/user01")
    public String getUser01(int userId) {}
    public String getUser01(@RequestParam(value="userId", required = false) int userId) {}
    
    // URI上的参数是必选的
    // http://localhost:8080/user02?userId=102 这个请求, getUser02这个方法才能被执行。
    @GetMapping("/user02")
    public String getUser02(@RequestParam int userId) {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    -(1)不加@RequestParam,前端的参数名需要和后端方法的变量名保持一致才能生效;
    -(2)不加@RequestParam,说明参数为可选的,加@RequestParam说明参数为必选的,但@RequestParam可以通过@RequestParam(required = false)设置为可选的;
    -(3)加@RequestParam,可以通过@RequestParam(“userId”)或者@RequestParam(value = “userId”)指定传入的参数名,或者直接使用@RequestParam,但是必须要求前后端保持一致;

    3. @RequestBody

    (A). 用于读取请求的body数据,使用系统默认配置的HttpMessageConverter 进行解析,然后把相应的数据映射到方法的参数上。一般情况下来说常用来处理application/json类型的内容,或者粗鲁的说:将请求体中的JSON数据绑定到方法对应的BEAN上。

    @PostMapping("/operlog")
    R<Boolean> saveLog(@RequestBody SysOperLog sysOperLog){}
    
    • 1
    • 2

    (B). @RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

  • 相关阅读:
    Vuex 4与状态管理实战指南
    Axios+Elementui+Vue+原生JS+后端原生java的JAVA web小组项目踩坑总结
    Dynamic Head: Unifying Object Detection Heads with Attentions
    Spring Boot报错 org.springframework.jdbc.BadSqlGrammarException
    java积累
    【华为OD机试】仿 LISP 运算
    AXera-pi使用使用记录(1)
    2022年11月高项案例分析答案解析
    CentOS(5)——rpm包和源码包区别
    开放式激光振镜运动控制器(一):ZMC408SCAN接口与功能
  • 原文地址:https://blog.csdn.net/goodjava2007/article/details/125424441