Spring Boot集成Hibernate Validator


廢話不多說,直接開始集成環境。

一、環境集成

  在項目中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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM