@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
通常用于查询参数而不是路径变量。