SpringBoot 参数校验 --Validation
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
参数添加校验规则注解、定义注解生效分组
@Data
public class SysUserParam extends BaseParam {
/**
* 主键
*/
@NotNull(message = "id不能为空",
groups = {edit.class, detail.class})
private Long id;
/**
* 账号
*/
@NotBlank(message = "账号不能为空", groups = {add.class, edit.class})
private String account;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空", groups = {add.class, edit.class})
private String name;
/**
* 校验分组
*/
public @interface add {}
public @interface edit {}
public @interface detail {}
}
接口添加校验启用注解和校验参数分组
@RestController
public class SysUserController {
@Resource
private SysUserService sysUserService;
/**
* 增加系统用户
*/
@PostMapping("/sysUser/add")
public ResponseData add(@RequestBody @Validated(SysUserParam.add.class)
SysUserParam sysUserParam) {
sysUserService.add(sysUserParam);
return new SuccessResponseData();
}
/**
* 编辑系统用户
*/
@PostMapping("/sysUser/edit")
public ResponseData edit(@RequestBody @Validated(SysUserParam.edit.class)
SysUserParam sysUserParam) {
sysUserService.edit(sysUserParam);
return new SuccessResponseData();
}
/**
* 查看系统用户
*/
@GetMapping("/sysUser/detail")
public ResponseData detail(@Validated(SysUserParam.detail.class)
SysUserParam sysUserParam) {
return new SuccessResponseData(sysUserService.detail(sysUserParam));
}
}
参数校验异常统一捕获处理
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ErrorResponseData methodArgumentNotValidException(MethodArgumentNotValidException e) {
String argNotValidMessage = getArgNotValidMessage(e.getBindingResult());
log.error(">>> 参数校验错误异常,具体信息为:{}", argNotValidMessage);
return renderJson(ParamExceptionEnum.PARAM_ERROR.getCode(), argNotValidMessage);
}
自定义校验规则
eg:手机号校验
@Documented
@Constraint(validatedBy = MobileValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MobileValue {
String message() default "手机号格式错误"
Class[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RUNTIME)
@Documented
@interface List {
MobileValue[] value();
}
}
public class MobileValidator implements ConstraintValidator<MobileValue, String> {
@Override
public boolean isValid(String mobileValue, ConstraintValidatorContext context) {
if(ObjectUtil.isNotEmpty(mobileValue)) {
return PhoneUtil.isMobile(mobileValue);
}
return false;
}
}
# 接口使用
@MobileValue
private String phone;
常用校验规则
-
@NotBlank
用于判断字符串非空,不能为null,不能为空字符串
-
@NotNull
用于判断基本类型不能为null
-
@NotEmpty
用于判断集合类非空,不能为null,长度必须大于0
-
@Size(min = 2, max = 14)
用于判断集合长度必须在最大值与最小值之间
-
@Range(min = 2,max = 4)
用于校验数据值在一定的范围内
-
@Min(2)
对象必须是数字,且值最小为设定值
-
@Max(12)
对象必须是数字,且值最大为设定值
-
@Length(min = 2, max = 4)
判断字符串长度
-
@Pattern
值必须满足给定的正则表达式
-
@Email
值必须为email格式
-
@AssertTrue
对象值如果不为null则必须为true
-
@AssertFalse
对象值如果不为null则必须为false
-
@Valid
用于实体参数,表示改实体参数也需要进行校验