spring boot validation實現對引數的校驗
阿新 • • 發佈:2018-12-14
validation實現對引數的校驗
配置流程
- 引入spring-boot-starter-validation包
- 配置註解介面,配置註解介面實現類(implements ConstraintValidator<註解介面, 返回值>)
- 配置校驗格式,並註解在實體類中
- 配置全域性異常處理。
程式碼(手機號碼驗證)
註解類
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(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 = false;
// 初始化註解
public void initialize(IsMobile isMobile) {
required = isMobile.required();
}
// 驗證
public boolean isValid(String value, ConstraintValidatorContext context) {
if(required) {
return ValidatorUtil.isMobile(value);
}else {
if(StringUtils.isEmpty(value)) {
return true;
}else {
return ValidatorUtil.isMobile(value);
}
}
}
}
驗證實現類
public class ValidatorUtil {
private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");
public static boolean isMobile(String src) {
if(StringUtils.isEmpty(src)) {
return false;
}
Matcher m = mobile_pattern.matcher(src);
return m.matches();
}
}
全域性異常處理
public class GlobalException extends RuntimeException{
private static final long serialVersionUID = 1L;
// 異常資訊類
private CodeMsg cm;
public GlobalException(CodeMsg cm) {
super(cm.toString());
this.cm = cm;
}
public CodeMsg getCm() {
return cm;
}
}
攔截異常類
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
// 攔截異常
@ExceptionHandler(value=Exception.class)
public Result<String> exceptionHandler(HttpServletRequest request, Exception e){
e.printStackTrace();
if(e instanceof GlobalException) {
GlobalException ex = (GlobalException)e;
return Result.error(ex.getCm());
}else if(e instanceof BindException) {
BindException ex = (BindException)e;
List<ObjectError> errors = ex.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
}else {
return Result.error(CodeMsg.SERVER_ERROR);
}
}
}
異常資訊類
public class CodeMsg {
private int code;
private String msg;
//通用的錯誤碼
public static CodeMsg SUCCESS = new CodeMsg(0, "success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服務端異常");
public static CodeMsg BIND_ERROR = new CodeMsg(500101, "引數校驗異常:%s");
public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已經失效");
public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登入密碼不能為空");
public static CodeMsg MOBILE_EMPTY = new CodeMsg(500212, "手機號不能為空");
public static CodeMsg MOBILE_ERROR = new CodeMsg(500213, "手機號格式錯誤");
public static CodeMsg MOBILE_NOT_EXIST = new CodeMsg(500214, "手機號不存在");
public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密碼錯誤");
private CodeMsg( ) {
}
private CodeMsg( int code,String msg ) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public CodeMsg fillArgs(Object... args) {
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code, message);
}
@Override
public String toString() {
return "CodeMsg [code=" + code + ", msg=" + msg + "]";
}
}