一、参数类型
常用的请求方式一般有两种:GEI
和POST
,GEI请求的传参方式一般都是直接拼接在url地址中,后台一般都是通过@RequestParam注解来接收url中的参数,当然也可以使用实体对象或者Map来接收;而POST请求一般都是以Json格式的数据放在请求体中,后台通过@RequestBody注解将其转换成对应的实体对象来接收。
(1)接收GET请求参数常见的有两种方式:
- @RequestParam:通过@RequestParam从GET请求的表单数据或查询参数中提取单个值。
@GetMapping("/parent")
public String createParent(@RequestParam("id") Integer id, @RequestParam("size") Integer size{
// ...
return "Parent created successfully";
}
- 实体对象:将表单数据或查询参数绑定到一个对象上。
@GetMapping("/parent1")
public String createParent1(Parent parent) {
// ...
return "Parent1 created successfully";
}
(2)接收POST请求参数一般通过@RequestBody注解将JSON格式的参数转换成实体对象。
@PostMapping("/parent2")
public String createParent2(@RequestBody Parent parent) {
// ...
return "Parent2 created successfully";
}
二、@RequestParam接收的参数校验
对于通过@RequestParam接收的参数进行参数校验时,必须在类上使用@Validated注解,方法参数上加不加@Validated或@Valid都不影响对该方法的参数校验
。
示例:
@RestController
@Validated
public class ParentController {
// 方法参数上不加@Validated或@Valid
@GetMapping("/parent1")
public String createParent1(@RequestParam("id") @Min(value = 1) Integer id, @RequestParam("size") @Max(value = 10) Integer size) {
// 业务逻辑处理
// ...
return "Parent1 created successfully";
}
// 方法参数上加@Validated
@GetMapping("/parent2")
public String createParent2(@Validated @RequestParam("id") @Min(value = 1) Integer id, @Validated @RequestParam("size") @Max(value = 10) Integer size) {
// 业务逻辑处理
// ...
return "Parent2 created successfully";
}
// 方法参数上加@Valid
@GetMapping("/parent3")
public String createParent3(@Valid @RequestParam("id") @Min(value = 1) Integer id, @Valid @RequestParam("size") @Max(value = 10) Integer size) {
// 业务逻辑处理
// ...
return "Parent3 created successfully";
}
}
只要在类上添加了@Validated注解,上面这些方法都会进行参数校验。
如果类上没有添加@Validated注解,就算在方法参数前加@Validated或@Valid也不会进行参数校验。
三、实体对象接收的参数校验
当使用实体对象接收参数进行参数校验时,必须在方法的实体对象参数前添加@Validated或@Valid注解,类上面加不加@Validated都不影响参数的校验
。
示例:
@RestController
public class ParentController {
// 使用@Validated对实体对象接收参数进行校验
@GetMapping("/parent1")
public String createParent1(@Validated Parent parent) {
// ...
return "Parent1 created successfully";
}
// 使用@Valid对实体对象接收参数进行校验
@PostMapping("/parent2")
public String createParent2(@Valid @RequestBody Parent parent) {
// ...
return "Parent2 created successfully";
}
}
只要在方法中的实体对象参数前添加了@Validated或@Valid注解,实体对象中的参数就会进行参数校验,
所在类上加不加@Validated注解都不影响实体对象中的参数校验。
四、既有@RequestParam接收的参数又有实体对象接收的参数方法
对于一个类中存在多种接收参数的方式,那么要想所有方法都实现参数校验的话,那就必须结合上面两种情况,既要在类上添加@Validated注解,又需要在实体对象接收的参数前使用@Validated或@Valid注解,才能使所有方法在调用的使用都先执行参数校验。
@RestController
@Validated
public class TestController {
// 使用实体对象接收参数,校验直接生效
@GetMapping("/parent1")
public String createParent1(@Validated Parent parent) {
// ...
return "Parent1 created successfully";
}
// 使用实体对象接收参数,校验直接生效
@PostMapping("/parent2")
public String createParent2(@Valid @RequestBody Parent parent) {
// ...
return "Parent2 created successfully";
}
@GetMapping("/parent3")
public String createParent3(@RequestParam("id") @Min(value = 1) Integer id, @RequestParam("size") @Max(value = 10) Integer size) {
// 业务逻辑处理
// ...
return "Parent3 created successfully";
}
}
五、总结
- 如果使用@RequestParam注解这种方式逐个接收请求参数的话,要想实现参数的校验就必须在类上添加@Validated;
- 如果使用实体对象来接收参数的话,要想实现参数的校验就必须在方法的实体对象参数前添加@Validated或@Valid注解;