参数校验
基本概念
从 springboot-2.3.x开始,spring-boot-starter-web不再引入 spring-boot-starter-validation,所以需要额外手动引入validation依赖,而 2.3之前的版本只需要引入 web 依赖。
@valid 与 @validate的区别
- @Valid注解,是 Bean Validation 所定义,可以添加在普通方法、构造方法、方法参数、方法返回、成员变量上,表示它们需要进行约束校验。
- @Validated注解,是 Spring Validation 所定义,可以添加在类、普通方法、方法参数上,表示它们需要进行约束校验
常用注解
注解 | 功能 |
---|---|
@NotBlank | 字符串不能为null,字符串trim()后也不能等于空字符串 |
@NotNull | 不能为null,可以是空 |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于空字符串 |
@Length | 长度必须在指定范围内 |
基本使用
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
配置校验注解
@Data
@Schema(description = "客户")
public class CarRenterForm {
/** 租车人 */
@NotBlank(groups = UpdateValidationGroup.class, message = "请选择客户")
private String openId;
/** 租车人姓名 */
@NotBlank(message = "租车人姓名不能为空")
private String renterName;
/** 手机号 */
@NotBlank(message = "手机号不能为空")
@Length(min = 18, max = 18, message = "手机号不合法")
private String phone;
/** 身份证号 */
@NotBlank(message = "身份证号不能为空")
@Length(min = 18, max = 18, message = "身份证号不合法")
private String idCardNo;
}
在controller中开启校验
@RestController
public class RenterController {
/**
* 新增平台客户
* 前面加@RequestBody注解时,校验失败时,抛MethodArgumentNotValidException异常
*/
@PostMapping
public boolean add(@Validated @RequestBody CarRenterForm carRenter) {
return carRenterService.insertCarRenter(carRenter);
}
/**
* 新增平台客户
* 没有添加@RequestBody,校验失败抛BindException异常
*/
@PostMapping
public boolean add(@Validated CarRenterForm carRenter) {
return carRenterService.insertCarRenter(carRenter);
}
}
GetMapping参数校验
controller增加validated注解
@Tag(name = "平台客户")
@Slf4j
@RestController
@RequestMapping("/rental/renter")
@RequiredArgsConstructor(onConstructor_ = {@Autowired})
@Validated
public class CarRenterController {
}
GetMapping参数接收
@GetMapping(value = "/{openId}")
public CarRenter getInfo(@NotBlank(message = "请选择客户") @PathVariable("openId") String openId) {
return carRenterService.selectCarRenterByOpenId(openId);
}
GetMapping对象接收
嵌套校验
分组校验
同一属性在新增时允许为空、在修改时不允许为空,此时就需要条件/分组校验
service方法校验
更多情况下是需要对Service层的接口进行参数校验的,那么该如何配置呢?在校验方法入参的约束时,如果是@Override父类或接口的方法,入参约束只能写在父类或接口上面。示例如下:
@Validated
public interface UserService {
@Validated(value = UserValidatedGroup.Create.class)
int save(@Valid UserVo user);
UserVo get(@Min(message = "id无效", value = 1) int id);
}
自定义校验规则
自定义校验规则比如手机号校验、身份证号校验、枚举参数校验、集合校验