自我理解:

validation 的使用可以让我们减少代码的书写 就是在代码里进行一些简单的逻辑判断 

判空 长 等 也可以自定义注解进行数据判定 

但是判断后返回的数据以异常形式抛出 是抛出到控制器 但是我们需要让这些数据返回到前端  那么就需要声明一个全局异常处理器 进行拦截这些异常进行处理  然后通过异常处理器 返回数据到 前端 

validation:使用

1;导依赖:

org.springframework.boot

spring-boot-starter-validation

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[] payload() default {};

}

注解的配置:

/*

* 手机号校验规则 注解校验手机号的配置类

* */

// 必须继承这个接口 然后参数为 作为那个注解的配置 和处理的数据类型

public class IsMobileValidator implements ConstraintValidator {

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

注解作用@Email被注释的元素必须是电子邮箱地址@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

 

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: