1. 程式人生 > >JSR-303 Bean Validation 介紹及 Spring MVC 服務端驗證最佳實踐

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

unit clas pre 服務 技術 artifact object out otn

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

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

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

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

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 對象更優雅的完成校驗的事情。

技術分享

騷年是不是很簡單?本文只做拋磚引玉之用,具體項目具體場景請自行拿捏。

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