首页 / 体育 / 正文

param(Spring Boot @RequestParam隐藏的强大功能)

放大字体  缩小字体 来源:上海动漫节 2026-04-15 13:35  浏览次数:9

1. 简介

在 Spring Boot 开发里,存在着众多实用注解,像 @RequestParam@PathVariable@RequestBody 等,它们能将方法参数精准绑定到 Web 请求的不同部分。

其中,@RequestParam 注解极为常见,无论是处理简单查询参数,还是应对复杂表单数据,它都能发挥作用。然而,不少开发者在实际使用中,往往仅掌握其基础用法,对它丰富且强大的功能,如参数默认值设置、类型自动转换、多值参数处理等,却未能充分挖掘与运用。

本篇文章,我们想详细的介绍@RequestParam注解的12个强大的用法,尤其是最后几个非常强大。

2.实战案例

2.1 简单使用

@GetMappingpublic String query(@RequestParam String name) {  return "请求参数name: %s".formatted(name) ;}

请求该接口后自动获取请求中的id参数,如:/params?name=pack_xg。这里的参数名称是name,那么底层会自动获取参数名称然后从当前的请求中获取对应的数据。

2.2 指定参数名称

@GetMappingpublic String query(    @RequestParam(name = "id") String userId,     @RequestParam String name) {  return "请求参数userId: %s, name: %s".formatted(userId, name) ;}

这里通过name属性指定了方法参数userId将对应到请求参数中的id。这里我们也可以使用value属性指定,或者不写@RequestParam("id")

2.3 可选参数

在默认情况下,如果我们指定的参数在请求中不存在,那么会抛出错误,如下示例:

@GetMapping("/1")public String query(@RequestParam String id) {  // ...}

如下请求,不提供id参数:

控制台输出

Resolved [org.springframework.web.bind.MissingServletRequestParameterException:   Required request parameter 'id' for method parameter type String is not present]

使用required属性可以设置参数是否必须:

public String query(@RequestParam(required = false) String id)

2.4 使用Optional

上面通过required属性设置为非必须外,我们还可以将参数类型定义为Optional类型,如下示例:

@GetMapping("/1")public String query(@RequestParam Optional<String> id) {  return "请求参数id: %s".formatted(id.orElseGet(() -> "默认值")) ;}

访问结果

2.5 提供默认值

除了上面2种方式以外,我们还可以为其提供默认值,这样也可以避免报错,如下示例:

@GetMapping("/1")public String query(  @RequestParam(defaultValue = "默认值2") String id)

2.6 获取所有参数

如果参数比较多,你又不想定义DTO,又不想定义N个参数形式,那么你还可以通过Map接收所有的参数,如下示例:

@GetMapping("/3")public String query(@RequestParam Map<String,String> params) {  return "请求参数: %s".formatted(params) ;}

访问结果

2.7 多值获取List集合

当我们的请求参数是多个取值时,我们可以使用List直接接收,如下示例:

@GetMapping("/4")public String query(@RequestParam List<String> ids) {  return "请求参数ids: %s".formatted(ids) ;}

访问结果

自动将以逗号分割的参数组装到List集合中。

2.8 动态参数名

我们还可以将接口参数名称设置为表达式(如: ${xxx}),如下示例:

@GetMapping("/5")public String queryName(@RequestParam("${pack.params.name}") String name) {  return "请求参数name: %s".formatted(name) ;}

配置文件

pack:  params:    name: firstName

访问结果

除此之外,我们还可以使用SpEL表达式,如下示例:

@GetMapping("/6")public String querySpEL(@RequestParam("#{@configProperties.getParamName()}") String name) {  return "请求参数name: %s".formatted(name) ;}

定义ConfigProperties组件

@Componentpublic class ConfigProperties {  private String paramName = "fullName";  public String getParamName() {    return paramName;  }  public void setParamName(String paramName) {    this.paramName = paramName;  }}

访问结果

2.9 动态默认值

在上面的示例中当请求参数中没有指定的参数时,我们通过设置defaultValue属性来提供默认的值,而该属性是支持SpEL表达式的,如下示例:

@GetMapping("/7")public String querySpELDefaulValue(    @RequestParam(defaultValue = "#{systemProperties['java.home']}")       String javaHome) {  return "请求参数javaHome: %s".formatted(javaHome) ;}

访问结果

2.10 参数boolean类型

当我们的请求参数是boolean类型,并且required为false以及无默认值时,那么默认会设置为false,如下示例:

@GetMapping("/8")public String queryBoolean(    @RequestParam(required = false) boolean deleted) {  return "请求参数deleted: %s".formatted(deleted) ;}

访问结果

如果这里的参数不是boolean类型,也不是其它的基本数据类型(int, float等),那么会自动返回null,如下示例:

@GetMapping("/9")public String queryObject(    @RequestParam(required = false) User user) {  return "请求参数user: %s".formatted(user) ;}public static record User(String name, Integer age) {}

访问结果

如果我们将这里的@RequestParam注解删除以后,那么我们就可以接收如下的参数,如下示例:

@GetMapping("/10")public String queryObjectParam(User user) {  return "请求参数user: %s".formatted(user) ;}

访问结果

2.11 参数值为空字符串

当我们的请求参数存在,但是值为空字符串时(""),同时defaultValue不为null,那么将取这里的默认值,如下示例:

@GetMapping("/11")public String queryEmptyString(    @RequestParam(defaultValue = "pack_xg") String name) {  return "请求参数name: %s".formatted(name) ;}

访问结果

2.12 参数类型转换

Controller接口的所有参数底层都会根据参数的类型自动进行转换,然后当参数类型转换后返回null时,这时候会判断如果defaultValue设置了值,那么会将默认值进行转换后进行设置参数值,如下示例:

// 1.定义接口@GetMapping("/12")public String queryStringToUser(@RequestParam User user) {  return "请求参数user: %s".formatted(user) ;}// 这里的参数使用了@RequestParam,那么默认是无法处理该参数的// 2.自定义类型转换器@Componentpublic class StringToUserConverter implements Converter<String, User> {  @Override  public User convert(String source) {    if (source == null || source.trim().length() == 0) {      return null ;    }    String[] values = source.split(",") ;    if (values.length != 2) {      return null ;    }    return new User(values[0], Integer.valueOf(values[1])) ;  }}

访问结果

正确转换了数据;修改请求参数如下:

报错了,因为当参数不满足要求时,上面的转换器将返回null,对于这种情况,我们可以提供默认值,如下示例:

@GetMapping("/12")public String queryStringToUser(    @RequestParam(defaultValue = "Spring Boot实战案例200讲,33")       User user) {  return "请求参数user: %s".formatted(user) ;}

访问结果

自动将defaultValue的值进行转换为User对象。

打赏
0相关评论
热门搜索排行
精彩图片
友情链接
声明:本站信息均由用户注册后自行发布,本站不承担任何法律责任。如有侵权请告知立立即做删除处理。
违法不良信息举报邮箱:115904045
头条快讯网 版权所有
中国互联网举报中心