1. 程式人生 > >spring boot validation實現對引數的校驗

spring boot validation實現對引數的校驗

validation實現對引數的校驗

配置流程

  1. 引入spring-boot-starter-validation包
  2. 配置註解介面,配置註解介面實現類(implements ConstraintValidator<註解介面, 返回值>)
  3. 配置校驗格式,並註解在實體類中
  4. 配置全域性異常處理。

程式碼(手機號碼驗證)

註解類

@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 + "]";
    }
}