Spring框架中@Valid的用法、JSR-303驗證

@Valid

@Valid用於限制請求的對象裏的參數是否必傳,適用於只是接口之間調用的情況

在Cotronller層上加@Valid註解

@RequestMapping("/do_login")
	@ResponseBody
	public Result<Boolean> doLogin(HttpServletResponse response,@Valid LoginVo loginVo){//valid參數校驗會拋出bindexception
		log.info(loginVo.toString());
		//userService.login(loginVo);
		return Result.success(true);
	}

註解的實體類

public class LoginVo {
	@NotNull(message="手機號未填")
	@IsMobile(message="非手機號")
	private String mobile;
	@NotNull(message="密碼未填")
	@Length(min=32,message="密碼長度太短")//md5處理過有32位
	private String password;
	
	public String getmobile() {
		return mobile;
	}
	public void setmobile(String mobile) {
		this.mobile = mobile;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "LoginVo [mobile=" + mobile + ", password=" + password + "]";
	}
}

編輯全局異常捕捉類

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
	private static Logger log=LoggerFactory.getLogger(LoginController.class);
	@ExceptionHandler(value = Exception.class)
	public Result<String> exceptionHandler(HttpServletRequest request, Exception e) {

		if (e instanceof BindException) {
			log.info("綁定異常");
			BindException ex = (BindException) e;
			List<ObjectError> errors = ex.getAllErrors();
			ObjectError error = errors.get(0);
			String msg = error.getDefaultMessage();
			log.info("Bind"+msg);
			return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
		} else if(e instanceof GlobalException){
			log.info("全局異常");
			GlobalException ex=(GlobalException)e;
			return Result.error(ex.getCm());
		}
		else {
			return Result.error(CodeMsg.SERVER_ERROR);
		}
	}

}

@Valid相關注解類型(JSR-303)

註解 作用
@Null 限制只能爲null
@NotNull 限制必須不爲null
@AssertFalse 限制必須爲false
@AssertTrue 限制必須爲true
@DecimalMax(value) 限制必須爲一個不大於指定值的數字
@DecimalMin(value) 限制必須爲一個不小於指定值的數字
@Digits(integer,fraction) 限制必須爲一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future 限制必須是一個將來的日期
@Max(value) 限制必須爲一個不大於指定值的數字
@Min(value) 限制必須爲一個不小於指定值的數字
@Past 限制必須是一個過去的日期
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在min到max之間
@Past 驗證註解的元素值(日期類型)比當前時間早
@NotEmpty 驗證註解的元素值不爲null且不爲空(字符串長度不爲0、集合大小不爲0)
@NotBlank 驗證註解的元素值不爲空(不爲null、去除首位空格後長度爲0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email 驗證註解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
@Length(min=, max=) 驗證元素值長度是否在指定長度範圍內

@Valid註解-自定義(JSR-303自定義驗證)

@IsMobile爲例
首先創建一個同名接口:

@Documented
@Constraint(validatedBy = {IsMobileValidator.class}) //引入實現類
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })  //@Target註解標記另外的註解用於限制此註解可以應用哪種Java元素類型。
@Retention(RUNTIME)
public @interface IsMobile {
//true:參數必須有,進行格式校驗      false:參數可以爲空,不爲空時也要進行進行格式校驗
	boolean required() default true;
	//未通過註解後輸出的信息,可以自定義
	String message() default "手機號碼格式錯誤";

	Class<?>[] groups() default { };

	Class<? extends Payload>[] payload() default { };
}

註解實現類,必須實現ConstraintValidator

public class IsMobileValidator implements ConstraintValidator<IsMobile, String>  {

	private static Logger log=LoggerFactory.getLogger(LoginController.class);
	
	public static boolean required=false;
	public void initialize(IsMobile constraintAnnotation) {
		required = constraintAnnotation.required();
	}

	@Override
	public boolean isValid(String mobile, ConstraintValidatorContext arg1) {
		if(required){  //是否必須傳參
			log.info("檢查手機號異常");
			return ValidatorUtil.isMobile(mobile);

		}else{
			if(StringUtils.isEmpty(mobile)){
				log.info("檢查手機號異常");
				return true;
			}else{
				log.info("檢查手機號異常");
				return ValidatorUtil.isMobile(mobile);//判斷是否爲手機號
			}
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章