什么是Validator参数效验器,为什么要用?
编码实现对用户名、密码、邮箱、身份证、手机号码的Validator的效验
实现一个手机号码的自定义效验
把validator异常加入全局异常处理器
背景:经常要对接口的参数做效验,登录的时候要效验用户名、密码是否为空,但是这种日常的接口参数效验太繁琐了,代码繁琐又多
就是采用Validator框架,少写代码,提升开发效率,例如email效验,用户名长度必须6到12之间等等,专门用来做参数的效验的
JSR-303验证规范,参数效验规范
springboot有3个特征:
1JSR303特征,是一项标准,只提供规范不提供实现,规定一些效验规范即效验注解,如@Null,@NotNull,@Pattern
hibernate validation特性
spring validation对hibernate validation进行了二次封装,在springmvc模块中添加了自动效验,并将验证消息封装进了特定的类中
步骤1:pom文件添加依赖
org.springframework.boot
spring-boot-starter-web
springboot天然支持validator数据效验
2创建一个VO类
UserVO,类中通过注解写入数据验证格式
3加一个体验类,一定要加上@Validated注解,它的作用是用来效验UserVO的参数是否正确
public void createUser(@RequestBody @Validated UserVO userVO){
}
步骤2:
自定义validator注解
写一个对手机号码的validator注解
创建一个@interface的手机效验注解
实现一个实现该接口的实现类
给UserVO类,加上手机号码效验注解
体验效果
把validator加入全局异常处理器
validator的异常特别复杂,客户端都看不懂,不友好,必须加入全局异常处理器
1全局异常处理器加入validator异常处理validarot统一异常封装
package com.example.demo.Controller;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.util.Date;
@Data
public class UserVO {
private Integer id;
@NotEmpty(message = "用户名不能为空")
@Length(min = 6,max = 12,message = "用户名长度必须在6-12之间")
private String username;
@NotEmpty(message = "密码不能为空")
@Length(min = 6,message = "密码长度不能小于6位")
private String password;
@Email(message = "请输入正确的邮箱")
private String email;
@Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$",message = "身份证格式错误")
private String idCard;
private Byte sex;
private Byte deleted;
private Date updateDate;
private Date createTime;
}
package com.example.demo.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping(value = "/user/create")
public void createUser(@RequestBody @Validated UserVO userVO){
}
}
2全局异常参数效验,在全局异常处理器中加入
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ErrorResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e,HttpServletRequest request){
String msgs = this.handle(e.getBindingResult().getFieldErrors());
ErrorResult error = ErrorResult.fail(ResultCode.PARAM_IS_INVALID,e,msgs);
log.warn("URL:{参数效验异常}",request.getRequestURI(),msgs);
return error;
}
private String handle(List<FieldError> fieldErrorList){
StringBuilder sb = new StringBuilder();
for(FieldError obj:fieldErrorList){
sb.append(obj.getField());
sb.append("=[");
sb.append(obj.getDefaultMessage());
sb.append("] ");
}
return sb.toString();
}