很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,在代码中相当冗长, 充满了if-else这种校验代码,今天我们就来学习spring的javax.validation 注解式参数校验.
一、配置步骤
1、导入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
2、统一返回值类:
public class Result<T> {
public static final Integer OK=200;
public static final Integer ERROR=-1;
private String msg;
private int code;
private T data;
private Result(T data) {
this.code = 200;
this.msg = "成功";
this.data = data;
}
private Result(CodeMsg cm) {
if(cm == null){
return;
}
this.code = cm.getCode();
this.msg = cm.getMsg();
}
private Result(String meg) {
this.code = ERROR;
this.msg = meg;
}
/**
* 成功时候的调用
* @return
*/
public static <T> Result<T> success(T data){
return new Result<T>(data);
}
/**
* 成功时候的调用,传入返回编码信息
* @return
*/
public static <T> Result<T> success(CodeMsg cm){
return new Result<T>(cm);
}
/**
* 成功,不需要传入参数
* @return
*/
@SuppressWarnings("unchecked")
public static <T> Result<T> success(){
return (Result<T>) success("");
}
/**
* 失败时候的调用
* @return
*/
public static <T> Result<T> error(CodeMsg cm){
return new Result<T>(cm);
}
/**
* 失败时候的调用,自定义错误信息
* @return
*/
public static <T> Result<T> error(String msg){
return new Result<T>(msg);
}
/**
* 失败时候的调用,扩展消息参数
* @param cm
* @param msg
* @return
*/
public static <T> Result<T> error(CodeMsg cm,String msg){
cm.setMsg(cm.getMsg()+"--"+msg);
return new Result<T>(cm);
}
public T getData() {
return data;
}
public String getMsg() {
return msg;
}
public int getCode() {
return code;
}
}
2、统一返回值编码:
public class CodeMsg {
private int code;
private String msg;
// 按照模块定义CodeMsg
// 通用异常
public static final CodeMsg SUCCESS = new CodeMsg(200,"success");
public static final CodeMsg ERROR = new CodeMsg(-1,"error");
public static final CodeMsg SERVER_EXCEPTION = new CodeMsg(500100,"服务端异常");
public static final CodeMsg PARAMETER_ISNULL = new CodeMsg(500101,"输入参数为空");
// 业务异常
public static final CodeMsg USER_NOT_EXSIST = new CodeMsg(500102,"用户不存在");
public static final CodeMsg ONLINE_USER_OVER = new CodeMsg(500103,"在线用户数超出允许登录的最大用户限制。");
public static final CodeMsg SESSION_NOT_EXSIST = new CodeMsg(500104,"不存在离线session数据");
public static final CodeMsg NOT_FIND_DATA = new CodeMsg(500105,"查找不到对应数据");
public static final CodeMsg LOGIN_SUCCESS=new CodeMsg(Result.OK,"登陆成功");
public static final CodeMsg LOGIN_ERROR_PASS=new CodeMsg(Result.ERROR,"用户名或密码错误");
public static final CodeMsg LOGIN_ERROR_CODE=new CodeMsg(Result.ERROR,"验证码错误");
public static final CodeMsg ADD_SUCCESS = new CodeMsg(Result.OK, "添加成功");
public static final CodeMsg ADD_ERROR = new CodeMsg(Result.ERROR, "添加失败");
public static final CodeMsg DELETE_SUCCESS = new CodeMsg(Result.OK, "删除成功");
public static final CodeMsg DELETE_ERROR = new CodeMsg(Result.ERROR, "删除失败");
public static final CodeMsg UPDATE_SUCCESS = new CodeMsg(Result.OK, "修改成功");
public static final CodeMsg UPDATE_ERROR = new CodeMsg(Result.ERROR, "修改失败");
public static final CodeMsg REGISTER_SUCCESS = new CodeMsg(Result.OK, "注册成功");
public static final CodeMsg REGISTER_ERROR = new CodeMsg(Result.ERROR, "注册失败");
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
二、使用步骤
1、注册用户测试:
2、请求接口加上@Valid
3、配置参数校验处理器
@ControllerAdvice
public class ValidatorHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
StringBuilder sb = new StringBuilder();
//循环获取校验参数错误信息
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
String defaultMessage = fieldError.getDefaultMessage();
sb.append(defaultMessage);
break;
}
return new ResponseEntity(Result.error(sb.toString()), HttpStatus.OK);
}
}
4、利用ApiPost测试效果:
用户名配置了不能传空以及不能为空
测试效果如下图:
配置用户不能不能小于2位或者大于8位
失败测试:
成功测试: