JSR-303 Bean Validation 介紹及 Spring MVC 服務端驗證最佳實踐


   任何時候,當要處理一個應用程序的業務邏輯,數據校驗是你必須要考慮和面對的事情。

   應用程序必須通過某種手段來確保輸入參數在上下文來說是正確的。

   分層的應用在很多時候,同樣的數據驗證邏輯會出現在不同的層,這樣就會導致代碼冗余和一些管理的問題。

   為了避免這樣或那樣的情況發生,最好是將驗證邏輯與相應的數據模型進行綁定。

1. JSR-303 Bean Validation

   JSR 是Java Specification Requests 的縮寫,是指向 JCP(Java Community Process) 提出新增一個標准化技術規范的正式請求。

   任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服務,已審核通過的規范涉及 Java 各個領域,有興趣可以了解一下。

   Bean Validation 是一個運行時的數據驗證框架,為 JavaBean 驗證定義了相應的元數據模型和 API。

   默認的元數據是 Java Annotations,當然也可以使用 XML 可以對已存在的元數據信息進行覆蓋和擴展。

   在應用中通過使用 Bean Validation 或是你自己定義的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以確保數據模型的正確性。

   constraint 可以注解到字段,getter 方法,類或者接口上面。對於一些特定的需求,用戶可以很容易的開發定制化的 constraint。

   Hibernate Validator 做為 Bean Validation 的參考實現 .提供了 JSR 303 規范中所有內置 constraint 的實現,除此之外還有一些附加的 constraint。

   Sun validation-api.jar 中定義的規范 constraint

   Hiber-Validator 自定義的幾個 constraint

2. Spring MVC 服務端驗證實踐

   只需要很簡單的三個步驟,就可以在 Spring MVC 中校驗數據模型,首先將需要的 jar 依賴進來

      <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.1.Final</version>
        </dependency>

   然后在需要校驗數據模型上添加校驗注解,如果數據模型為引入其他公司或項目,編寫 xml 同樣是可行的。

public class UserVO { @NotNull(message = "uuid 不能為空!") private String uuid; @NotEmpty(message = "用戶名稱不能為空!") private String name; private String passwd; private String sex; private Date birthday; @Length(min = 11, max = 11, message = "電話號碼長度必須為11位!") private String phone; private String photo; @Email(message = "電子郵箱地址不合法!") private String email; private String yxbz; private String sorts; .....setter/getter }

   最后就是驗證並獲取結果的過程,你可以硬編碼編寫通用方法在項目中使用,像下面這樣。

   private void validBean(Object targerBean) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Object>> violations = validator.validate(targerBean);
        for (ConstraintViolation<Object> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }

   或者你可以借助 Spring MVC 封裝好的 Validated 注解 和 BindingResult 對象更優雅的完成校驗的事情。

   本文只做拋磚引玉之用,具體項目具體場景請自行拿捏。

 


免責聲明!

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



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