@RequestParam和@PathVariable的区别是什么?详解两者用法

 更新时间:2026年11月10日 15:44:00   作者:星星@点点  
还在为SpringMVC参数绑定发愁吗?本文详细解析@RequestParam、@PathVariable和@RequestBody三个核心注解的用法、参数和区别,通过实际示例教你如何正确接收URL参数、路径变量和JSON数据,避免常见错误,提升开发效率

1、@RequestParam注解

主要参数如下:

  • String value:请求中传入参数的名称,如果不设置value值,则会默认为该变量名即参数名一致。
  • String name:等价与value,和value无本质上的差异,两个属性指定其一即可。
  • boolean required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)
  • String defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。

注意事项:

1、如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通 过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。如:public String test(@RequestParam(value="name") String username)

2、如果参数前不写@RequestParam(xxx)的话,那么就前端可以有可以没有对应的xxx名字才行,如果有xxx名的话,那么就会自动匹配;没有的话,请求也能正确发送。如:public String test(@RequestParam String username)

样例:

@GetMapping("/test_RequestParam")
public String test_RequestParam(@RequestParam String name){
    return name;
}

运行效果:

 2、@PathVariable注解

@PathVariable注解是映射URL绑定占位符

注意参数如下:

  • String value:可指定占位符 { } 中的参数名,若只指定value这一个属性可省略属性名不写,若占位符中的参数名和处理方法中的参数名相同可省略此属性。
  • String name:等价与value,和value无本质上的差异,两个属性指定其一即可。
  • boolean required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)

样例:

@GetMapping("/test_PathVariable/{name}")
public String test_PathVariable(@PathVariable String name){
     return name;
}

运行效果:

 

@RequestParam和@PathVariable区别

都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在参数部分,另一个在URL路径部分。

  • @PathVariable主要用于接收http://host:port/path/{参数值}数据。
  • @RequestParam主要用于接收http://host:port/path?参数名=参数值数据。
  • @RequestParam和@PathVariable这两者之间区别不大,主要是请求的URL不一样

3、@RequestBody注解

@RequestBody用来处理不是 application/x-www-form-urlencoded 编码的内容例如:application/json application/xml

form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST等方式进行提交。

注意事项

如果后端参数是一个对象,且该参数前是以@RequestBody修饰的,那么前端传递json参数时,必须满足以下要求:

后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为), 实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。

json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。

json字符串中,如果value为null的话,后端对应收到的就是null。

如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或""都行

样例

1、参数是实体类对象

编写实体类User

package com.example.springboot.entity;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author wengly
 * @date 2022-07-09 15:12:54
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserEntity {
    private String name;
    private int age;
}

编写controller

package com.example.springboot.controller;

import com.example.springbootdocker.entity.UserEntity;
import org.springframework.web.bind.annotation.*;

/**
 * @author wengly
 * @date 2022-07-01 16:01:08
 */
@RestController
public class TestController {

    /**
     * @author wengly
     * @date 2022-07-01 16:01:08
     * @RequestBody
     */
    @PostMapping("/test_RequestBodyUser")
    public UserEntity test_RequestBodyUser(@RequestBody UserEntity userEntity){
        return userEntity;
    }
}

运行效果:

 2、参数是普通字符串

编写controller:

package com.example.springbootdocker.controller;

import com.example.springbootdocker.entity.UserEntity;
import org.springframework.web.bind.annotation.*;

/**
 * @author wengly
 * @date 2022-07-01 16:01:08
 */
@RestController
public class TestController {

    /**
     * @author wengly
     * @date 2022-07-01 16:01:08
     * @RequestBody
     */
    @PostMapping("/test_RequestBody")
    public String test_RequestBody(@RequestBody String name){
        return name;
    }

}

运行效果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java Swing中的文本区(JTextArea)实现换行保存到文件的几个方法

    Java Swing中的文本区(JTextArea)实现换行保存到文件的几个方法

    这篇文章主要介绍了Java Swing中的文本区(JTextArea)实现换行保存到文件的几个方法,本文给出了4种方法,需要的朋友可以参考下
    2014-10-10
  • Java中处理I/O操作的不同方式

    Java中处理I/O操作的不同方式

    BIO、NIO和AIO是Java中处理I/O操作的三种不同方式,它们分别代表阻塞I/O、非阻塞I/O和异步I/O,本文我们结合代码进行一个综合演示,代码由于是伪代码,可能存在不足,仅供大家参考
    2024-02-02
  • Java中关于int和Integer的区别详解

    Java中关于int和Integer的区别详解

    本篇文章小编为大家介绍,在Java中 关于int和Integer的区别详解,需要的朋友参考下
    2013-04-04
  • 使用spring boot 整合kafka,延迟启动消费者

    使用spring boot 整合kafka,延迟启动消费者

    这篇文章主要介绍了使用spring boot 整合kafka,延迟启动消费者的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java面试必备八股文整理

    Java面试必备八股文整理

    这篇文章主要介绍了Java面试必备八股文整理,小伙伴们出去面试的时候会被问到很多java专业性的知识,那么八股文就是为此而出现的,需要的朋友可以参考下
    2023-03-03
  • Lombok不生效怎么办?排查编译错误与版本兼容问题

    Lombok不生效怎么办?排查编译错误与版本兼容问题

    你的Lombok在构建时总报错?可能是版本不兼容或缺少annotationProcessor,本文详解Lombok不生效的常见原因,包括IDEA编译错误、Gradle依赖配置、boolean属性isXXX问题及批量Delombok操作,帮你快速修复Lombok运行问题
    2026-08-08
  • 基于自定义BufferedReader中的read和readLine方法

    基于自定义BufferedReader中的read和readLine方法

    下面小编就为大家分享一篇基于自定义BufferedReader中的read和readLine方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 详解MyBatis特性之动态SQL

    详解MyBatis特性之动态SQL

    动态 SQL 是 MyBatis 的强大特性之一,这篇文章我们将结合动态SQL完成更加复杂的 SQL 操作,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Java循环队列原理与用法详解

    Java循环队列原理与用法详解

    这篇文章主要介绍了Java循环队列原理与用法,结合实例形式详细分析了Java循环队列基本概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • 解决Springboot项目打包后的页面丢失问题(thymeleaf报错)

    解决Springboot项目打包后的页面丢失问题(thymeleaf报错)

    这篇文章主要介绍了解决Springboot项目打包后的页面丢失问题(thymeleaf报错),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论