Bean Validation參數校驗筆記

前言

Bean Validation是一個驗證參數的規範,能簡化代碼,讓我們儘量避免寫很多的冗餘的代碼來校驗輸入參數的正確性,特別是暴露給外部用的api,必須要做參數驗證,下面就將常用的驗證方式做一個記錄。

步驟
  • 1) pom中引入Bean validation的實現hibernate-validator

  
  
  
  1. <dependency>

  2.            <groupId>org.hibernate</groupId>

  3.            <artifactId>hibernate-validator</artifactId>

  4.            <version>6.0.13.Final</version>

  5.        </dependency>

  • 2)定義接收參數的實體,加上驗證註解

  
  
  
  1.   @NotNull(message = "姓名不能爲空!")

  2.    private String name;


  3.    @NotEmpty(message = "手機號不能爲空及空字符")

  4.    @Size(min = 11, max = 11, message = "手機號爲11位")

  5.    private String phone;

  • 3) 創建校驗器,編寫測試類

  
  
  
  1. Validator validator = Validation.buildDefaultValidatorFactory().getValidator();


  2.   /**

  3.     * 校驗規則:object != null;

  4.     */

  5.    @Test

  6.    public void testNotNull(){

  7.        User user = new User();

  8.        user.setName("俠夢"); //size=0

  9. //        user.setName(""); //size =0

  10. //        user.setName(null); //size = 1

  11.        Set<ConstraintViolation<User>> violations = validator.validate(user);

  12.        Assert.assertEquals(violations.size(),0);

  13.    }

  • 4) 結合java8昇華校驗

  • 校驗集合內部的元素,注意正確寫法是寫在聲明的泛型類型前面,而不是像傳統校驗一樣另起一行,這樣會導致異常No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.util.List

  
  
  
  1.  private List<@NotBlank(message = "存在的郵箱元素不能爲空") String> emails;


  2.   private Map<@Email String, @NotNull User> customers;

  • 結合Optional校驗

  
  
  
  1. private Integer age;

  2.    public Optional<@Min(18) Integer> getAge() {

  3.        return Optional.ofNullable(age);

  4.    }

  • 5)自定義驗證器

  • 開發中,經常會有很多字段,固定就只能是一些範圍內的值,我們可以自定義一個驗證器來約束它們,例如:用戶來源這個字段,只會有三種,微信、qq和微博,首先我們定義一個@interface註解,通過Constraint的validatedBy指定一個驗證器,在驗證器中,實現ConstraintValidator接口,覆寫isValid方法,讓@UserSource校驗的字段,只能是這三個值。

  
  
  
  1. @Retention(RetentionPolicy.RUNTIME)

  2. @Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })

  3. @Constraint(validatedBy = {UserTypeValidator.class})

  4. @Documented

  5. public @interface UserSource {

  6.    String message() default "用戶來源不正確,請檢查!";

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

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

  9. }

  10. public class UserTypeValidator implements ConstraintValidator<UserSource, String> {

  11.    private List<String> sources = Arrays.asList(new String[]{"wechat","qq","weibo"});

  12.    @Override

  13.    public boolean isValid(String value, ConstraintValidatorContext context) {

  14.       return sources.contains(value);

  15.    }

  16. }


  17. @UserSource(message = "錯誤的用戶來源!")

  18. private String source;

  • 6)總結

  • 日常開發中,大多都沒有在數據庫設置外鍵關係,而是用應用程序來維護,所以參數的校驗是十分重要的,在程序保存記錄前,可以使用validation來校驗輸入的參數,如果不滿足規則,則拋出異常,避免存入髒數據。


本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章