@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,也可以通過正則表達式和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);//判斷是否爲手機號
}
}
}