@RequestParam(default)接口参数默认值的坑

先看接口

    @GetMapping("/queryByPage/{pageNum}/{pageSize}")
    @ApiOperation("分页查询学生")
    public Result<Page<Student>> queryByPage(@RequestParam(required = true,defaultValue = "1") @PathVariable Integer pageNum, @PathVariable Integer pageSize) {
        return studentService.queryByPage(pageNum, pageSize);
    }

注意 pageNum参数,测试的时候发现不管传什么都是 1,但是去掉@RequestParam就能正常使用

后来发现@RequestParam(default="1") @PathVariable 同时使用,无论传不传参数,都会使用默认值!!


在 Spring MVC 中,@PathVariable@RequestParam 是用于从请求中获取参数值的注解,它们通常用于处理 HTTP 请求中的路径变量和请求参数。在同一个参数上同时使用这两个注解通常是不合理的,因为它们分别用于不同的参数来源。

  • @PathVariable 用于从请求的 URI 中提取路径变量,例如 /abc/{id} 中的 id。这个注解通常用于将 URI 模板变量映射到方法的参数上。

  • @RequestParam 用于从请求的查询参数中获取值。查询参数是通过 URL 中的 ?key=value 形式传递的,而不是通过 URI 路径。

在上面例子中,@PathVariable 注解已经用于路径变量pageNum,因此使用 @RequestParam 同时修饰同一个参数是多余的,而且可能引起混淆。如果你的方法需要获取路径变量 id,那么只需使用 @PathVariable 注解即可。如果需要处理查询参数,可以另外定义一个参数,并使用 @RequestParam 注解。

如果使用@PathVariable 注解还想设置默认值呢?

可以在方法参数上直接为该参数提供默认值。在 Spring MVC 中,你可以使用 Java 8 的 Optional 类型来处理可能为空的参数,并在方法中设置默认值。

@RequestMapping("/abc/{id}")
public Result testa(@PathVariable(value = "id") Optional<Integer> id) {
    Integer actualId = id.orElse(1); // 设置默认值为 1
    // Your method logic here
    return null;
}

在这个例子中,id 参数使用 Optional<Integer> 类型,这允许它接受可能为空的值。然后,在方法体内使用 orElse 方法设置了默认值为 1。如果路径中没有提供 id 变量,那么 id.orElse(1) 将返回默认值 1。

Optional 是 Java 8 引入的一个类,用于更好地处理可能为 null 的值,但这里它也用于处理可能不存在的路径变量。这样做可以避免在方法参数上使用 @RequestParam 注解,因为 @RequestParam 通常用于查询参数而不是路径变量。

posted @ 2023-11-30 21:25  ygdgg  阅读(840)  评论(5编辑  收藏  举报