廢話不多說,直接開始集成環境。
一、環境集成
在項目中hibernate-Validator包在spring-boot-starter-web包里面有,不需要重復引用 。(整個Demo都是用PostMan軟件進行數據傳輸。)
二、Demo實例
此Mode中添加了些簡單、常用的Validator注解
1 import com.shida.api.baseData.validatorUtils.IsMobile; 2 import org.hibernate.validator.constraints.Length; 3 import javax.validation.Valid; 4 import javax.validation.constraints.NotNull; 5 import java.io.Serializable; 6 7 public class AccountVO implements Serializable { 8 9 /** 10 * 手機號 11 */ 12 @IsMobile 13 private String account; 14 15 /** 16 * 密碼 17 */ 18 @NotNull 19 @Length(min = 1 , max = 6 , message = "密碼不能為空且長度需要在1和6之間") 20 private String password; 21 22 /** 23 * 賬戶狀態 24 */ 25 @NotNull(message = "賬號狀態不能為空") 26 private Integer status; 27 28 /** 29 * 賬戶擴展信息 30 */ 31 @Valid 32 private UserInfoVO userInfoVO; 33 34 public String getAccount() {return account;} 35 36 public void setAccount(String account) {this.account = account;} 37 38 public String getPassword() {return password;} 39 40 public void setPassword(String password) {this.password = password;} 41 42 public Integer getStatus() {return status;} 43 44 public void setStatus(Integer status) { this.status = status;} 45 46 public UserInfoVO getUserInfoVO() {return userInfoVO;} 47 48 public void setUserInfoVO(UserInfoVO userInfoVO) {this.userInfoVO = userInfoVO;} 49 }
接下來Post接口驗證,Controller中調用DemoVO驗證集合校驗情況:
1 package com.shida.account.center.controller; 2 3 4 import com.base.data.common.message.MessageVo; 5 import com.base.data.common.message.StatusCode; 6 import com.shida.account.center.service.IAccountService; 7 import com.shida.api.baseData.model.AccountVO; 8 import org.springframework.validation.annotation.Validated; 9 import org.springframework.web.bind.annotation.*; 10 import org.springframework.web.bind.annotation.PostMapping; 11 import org.springframework.web.bind.annotation.RequestMapping; 12 import org.springframework.web.bind.annotation.RestController; 13 14 import javax.annotation.Resource; 15 import javax.validation.Valid; 16 17 @RestController 18 @Validated 19 @RequestMapping("/data/account") 20 public class AccountController { 21 22 @Resource 23 private IAccountService accountService; 24 25 /** 26 * 添加賬戶 27 * @param accountVO 28 * @return 29 */ 30 @PostMapping(value = "/add") 31 public MessageVo addAccount(@Valid @RequestBody AccountVO accountVO){ 32 MessageVo message = new MessageVo(); 33 accountService.addAccount(accountVO); 34 message.setCode(StatusCode.success); 35 message.setMsg("賬戶添加成功"); 36 message.setResult(accountVO); 37 return message; 38 } 39 }
PostMan請求入參:

PostMan返回結果:(MessageVo是我自己寫的一個返回Mode,用於承載返回結果。)
{ "code": "204", "msg": "前后端校驗發生異常+[accountVO.account:手機號碼錯誤][accountVO.password:密碼不能為空][accountVO.status:賬號狀態不能為空]", "result": null }
注:如果實體類想參與校驗則需要在實體類前加@Valid注解。不加則不參與校驗。
三、對象級聯校驗填坑。
1、對象級聯校驗方式。
對象級聯校驗Mode為對象內部包含另一個對象最為屬性。內部對象也需要加入@Valid注解。則開啟內部對象校驗。(如果用PostMan作為自測接口方式,需要另加@RequestBody注解,RequestBody會自動將參數分配到各個Type中。否則會報錯。)
集合類的入參同樣也需要用@RequestBody注解。
controller實例:
public MessageVo addAccount(@Valid @RequestBody AccountVO accountVO){ MessageVo message = new MessageVo(); return message; }
Mode實例:
1 public class AccountVO implements Serializable { 2 3 @IsMobile 4 private String account; 5 6 @Valid 7 private UserInfoVO userInfoVO; 8 9 }
UserInfoVO實例:
1 public class UserInfoVO implements Serializable { 2 3 @NotNull 4 private Integer sex; 5 6 }
PostMan校驗結果:

四、自定義校驗器
一般情況,自定義驗證可以解決很多問題。但也有無法滿足情況的時候,此時,我們可以實現validator的接口,自定義自己需要的驗證器。如下所示,實現了一個自定義的大小寫驗證器:
1 public enum CaseMode { 2 UPPER, 3 LOWER; 4 } 5 6 7 @Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) 8 @Retention(RetentionPolicy.RUNTIME) 9 @Constraint(validatedBy = CheckCaseValidator.class) 10 @Documented 11 public @interface CheckCase { 12 String message() default ""; 13 14 Class<?>[] groups() default {}; 15 16 Class<? extends Payload>[] payload() default {}; 17 18 CaseMode value(); 19 } 20 21 22 public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> { 23 private CaseMode caseMode; 24 public void initialize(CheckCase checkCase) { 25 this.caseMode = checkCase.value(); 26 } 27 28 public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 29 if (s == null) { 30 return true; 31 } 32 33 if (caseMode == CaseMode.UPPER) { 34 return s.equals(s.toUpperCase()); 35 } else { 36 return s.equals(s.toLowerCase()); 37 } 38 } 39 }
要驗證的Model:
1 public class Demo{ 2 @CheckCase(value = CaseMode.LOWER,message = "userName必須是小寫") 3 private String userName; 4 5 public String getUserName() { 6 return userName; 7 } 8 9 public void setUserName(String userName) { 10 this.userName = userName; 11 } 12 }
validator配置:
1 @Bean 2 public Validator validator(){ 3 ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) 4 .configure() 5 .addProperty( "hibernate.validator.fail_fast", "true" ) 6 .buildValidatorFactory(); 7 Validator validator = validatorFactory.getValidator(); 8 9 return validator; 10 }
驗證測試:
1 @RequestMapping("/demo4") 2 public void demo4(){ 3 Demo demo = new Demo(); 4 demo.setUserName("userName"); 5 Set<ConstraintViolation<Demo>> validate = validator.validate(demo); 6 for (ConstraintViolation<Demo> dem : validate) { 7 System.out.println(dem.getMessage()); 8 } 9 }
輸出結果:
userName必須是小寫
五、常見注解。
1 Bean Validation 中內置的 constraint 2 @Null 被注釋的元素必須為 null 3 @NotNull 被注釋的元素必須不為 null 4 @AssertTrue 被注釋的元素必須為 true 5 @AssertFalse 被注釋的元素必須為 false 6 @Min(value) 被注釋的元素必須是一個數字,其值必須大於等於指定的最小值 7 @Max(value) 被注釋的元素必須是一個數字,其值必須小於等於指定的最大值 8 @DecimalMin(value) 被注釋的元素必須是一個數字,其值必須大於等於指定的最小值 9 @DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小於等於指定的最大值 10 @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內 11 @Digits (integer, fraction) 被注釋的元素必須是一個數字,其值必須在可接受的范圍內 12 @Past 被注釋的元素必須是一個過去的日期 13 @Future 被注釋的元素必須是一個將來的日期 14 @Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式 15 Hibernate Validator 附加的 constraint 16 @NotBlank(message =) 驗證字符串非null,且長度必須大於0 17 @Email 被注釋的元素必須是電子郵箱地址 18 @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內 19 @NotEmpty 被注釋的字符串的必須非空 20 @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內
六、參考資料
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html#_label5
