@RequestParam 注解接收的参数
value
:参数名称,与 name 一样name
:参数名称,与 value 一样required
:是否必须,默认为 truedefaultValue
:默认值,默认为 null
测试
下面通过控制 required
、defaultValue
参数,测试 @RequestParam
在接以空参数
或未传参数
时的表现。
测试一
定义一个 GET
请求接口,param
参数为必传(默认就是必传的):
@GetMapping("/test01")
public String test01(@RequestParam(name = "param", required = true) String param) {
return "param = " + param;
}
不传 param
参数时,则返回 404
:
GET http://localhost:8080/test01
{
"timestamp": "2021-10-12T02:02:35.071+00:00",
"status": 400,
"error": "Bad Request",
"message": "",
"path": "/test01"
}
传的 param
参数为空串时,接收到 param
为空串:
GET http://localhost:8080/test01?param=
param =
测试二
定义一个 GET 请求接口,param 参数为非必传:
@GetMapping("/test02")
public String test02(@RequestParam(name = "param", required = false) String param) {
return "param = " + param;
}
不传 param
参数时,接收到 param
为 null
:
GET http://localhost:8080/test02
param = null
param
传了空串时,接收到 param 为空串:
GET http://localhost:8080/test02?param=
param =
测试三
定义一个 GET 请求接口,param 参数为非必传,并指定 defaultValue 默认值:
@GetMapping("/test03")
public String test03(@RequestParam(name = "param", required = false, defaultValue = "defaultValue")
String param) {
return "param = " + param;
}
不传 param
参数时,则 param
为默认值:
GET http://localhost:8080/test03
param = defaultValue
如果 param
传了空串,param
为默认值
GET http://localhost:8080/test03?param=
param = defaultValue
测试四
定义一个 GET 请求接口,param
参数为必传,并指定 defaultValue
默认值:
@GetMapping("/test04")
public String test04(@RequestParam(name = "param", required = true, defaultValue = "defaultValue")
String param) {
return "param = " + param;
}
不传 param
参数时,则 param
为默认值:
GET http://localhost:8080/test04
param = defaultValue
param
传了空串时,param
为默认值:
GET http://localhost:8080/test04?param=
param = defaultValue
测试总结
只有 required
为 true
时没有传递参数会出现 404
的情况,这一点比较诡异。
优雅地校验参数
引入相关依赖
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
在Spring容器注入MethodValidationPostProcessor对象
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
public class ValidationConfigure {
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
新建全局异常拦截器
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationException(ConstraintViolationException e) {
return e.getConstraintViolations().stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining("; "));
}
}
测试
在控制器类上方增加 @org.springframework.validation.annotation.Validated
注解,新建一个 GET 请求接口,在 param 参数中使用校验注解 @org.hibernate.validator.constraints.NotBlank
:
@RestController
@Validated
public class TestController {
@GetMapping("/test05")
public String test05(@NotBlank(message = "param is not blank")
@RequestParam(value = "param")
String param) {
return "param = " + param;
}
}
如果 param 传了空串,返回参数校验异常信息:
GET http://localhost:8080/test05?param=
param is not blank