自我理解:
validation 的使用可以让我们减少代码的书写 就是在代码里进行一些简单的逻辑判断
判空 长 等 也可以自定义注解进行数据判定
但是判断后返回的数据以异常形式抛出 是抛出到控制器 但是我们需要让这些数据返回到前端 那么就需要声明一个全局异常处理器 进行拦截这些异常进行处理 然后通过异常处理器 返回数据到 前端
validation:使用
1;导依赖:
<!--validation-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2:使用
实体类:
在属性上加上validation的注解进行判断属性 需要在使用判断的地方声明
@Valid 注解
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginVo {
@NotNull(message = "手机号为空")//不能为空
@IsMobile //自定义的注解 判断手机号格式
private String mobile;
@NotNull
@Length(min = 32) //长度最骚为 32位
private String password;
}
controller:
/*** 登录 * @return */
@RequestMapping("/doLogin")
@ResponseBody
//@Valid 是声明该属性使用validation进行校验
public RespBean doLogin(@Valid LoginVo loginVo) {
log.info(loginVo.toString());
return userService.login(loginVo);
}
}
3:自定义注解:
从其他的判断注解copy模板
自己需要设置配置类 自定义返回的报错消息 等等
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//设置配置类 即 该注解怎末进行判断
@Constraint(
validatedBy = {IsMobileValidator.class}
)
public @interface IsMobile {
boolean required() default true; //设置为必填
String message() default "{手机号格式错误}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
注解的配置:
/*
* 手机号校验规则 注解校验手机号的配置类
* */
// 必须继承这个接口 然后参数为 作为那个注解的配置 和处理的数据类型
public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {
private boolean required=true;
@Override
public void initialize(IsMobile constraintAnnotation) {
//判断是否为必填项
required = constraintAnnotation.required();
}
@Override // 接受传来的参数
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (required){
//为必填 代表肯定有数据直接用工具类判断直接判断
return ValidatorUtil.isMobile(s);
}else {
//不为必填
if (s.isEmpty()){
//为空返回false
return false;
}else {
//不为空 进行用工具类判断
return ValidatorUtil.isMobile(s);
}
}
}
}
定义的工具类
/*** 校验工具类 ** @author zhoubin * @since 1.0.0 */
public class ValidatorUtil {
//定义一个正则表达式
private static final Pattern mobile_pattern = Pattern.compile("[1]([3-9])[0-9]{9}$");
//定义一个方法判断
public static boolean isMobile(String mobile){
//判断参数是否为空
if (StringUtils.isEmpty(mobile)) {
return false;
}
//判断参数是否和正则表达式匹配
Matcher matcher = mobile_pattern.matcher(mobile);
//返回匹配的结果
return matcher.matches();
}
}
全局异常处理器:
//声明为异常处理器
@RestControllerAdvice
public class GlobalExceptionHandler {
//进行具体异常分类处理
//拦截所以异常进行抓取 处理
@ExceptionHandler(Exception.class)
public RespBean exceptionHandle(Exception exception){
//判断异常类型
if (exception instanceof GlobalException){
//拦截的是自定义的异常
GlobalException globalException= (GlobalException) exception;
// 参数为 全局异常的枚举
return RespBean.error(globalException.getRespBeanEnum());
}else if (exception instanceof BindException){
//拦截的是validator绑定的异常
BindException bindException= (BindException) exception;
//定义返回为绑定错误
RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);
//设置数据为绑定消息
respBean.setMessage(
RespBeanEnum.BIND_ERROR.getMessage()
+":::"+bindException.getBindingResult()
.getAllErrors()
.get(0)
.getDefaultMessage()
);
return respBean;
}
//不属于那两个异常 就返回这
return RespBean.error(RespBeanEnum.ERROR);
}
}
自定义的异常:
/*
* 自定义的异常 定义一个枚举属性
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GlobalException extends RuntimeException {
private RespBeanEnum respBeanEnum;
}
注解 | 作用 |
---|---|
@Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator 附加的 constraint
注解 | 作用 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length(min=, max=) | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range(min=, max=) | 被注释的元素必须在合适的范围内 |
@NotBlank | 被注释的字符串的必须非空 |
@URL(protocol=,host=, port=,regexp=, flags=) | 被注释的字符串必须是一个有效的url |
容易记错的
@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0