1. 程式人生 > >java bean 校驗validation

java bean 校驗validation

引數校驗是我們程式開發中必不可少的過程。為了保持程式的健壯性,需要對資料進行校驗。

  1. 簡單的校驗

    在po實體類中添加註解

import org.hibernate.validator.constraints.Length;

/**
 * 通知記錄
 *
 * @author cuijiao
 * @date 2018年1月12日
 */
public class Inform {
    private Long id;

    @Length(min = 0, max = 50)
    private String title;

    @Length(min = 0, max = 255
) private String content; private String acceptorId; private String acceptorName; // 通知方式:簡訊、郵箱、系統通知 private Integer informWay; // 是否緊急0否1是 private Boolean isUrgent; }

在controller中使用此校驗

 /**
     * 新增Inform物件
     * @param book
     */
    @RequestMapping(value = "/test"
, method = RequestMethod.POST) public void addInform(@Valid Inform inform) { System.out.println(inform.toString()); }
  1. 關聯校驗
    在一個有關聯關係的欄位或者屬性上標註 @Valid . 這樣,如果一個物件被校驗,那麼
    它的所有的標註了 @Valid 的關聯物件都會被校驗
/**
*Person類
*/
public class Person {
@NotNull
private String name;
public Person() {
}
}
/**
*Car類
*/
public class Car { @NotNull @Valid private Person driver; public Car(Person driver) { this.driver = driver; }

如果校驗 Car 的例項物件的話,因為它的driver屬性標註了 @Valid , 那麼關聯的 Person 也會被校驗.
所以,如果物件 Person 的name屬性如果是 null 的話,那麼校驗會失敗.

關聯校驗也適用於集合型別的欄位, 也就是說,任何下列的型別:

•陣列
•實現了 java.lang.Iterable 介面( 例如 Collection , List 和 Set )
•實現了 java.util.Map 介面
如果標註了 @Valid , 那麼當主物件被校驗的時候,這些集合物件中的元素都會被校驗.

public class RecordAttachment {
    private Long id;

    private Long opId;

    private String name;

    @URL
    private String url;
   }

/**
 * 操作日誌封裝物件
 *
 * @author cuijiao
 * @date 2018年1月22日
 */
public class RecordDTO extends Record {
    /**
     * 操作日誌附件
     */
    @Valid
    private List<RecordAttachment> recordAttachments;
   }

如果校驗RecordDTO時,附件集合中任一附件url不符合url正則,校驗就會失敗

  1. 分組校驗
    定義兩個空介面,分別代表物件的增加校驗規則和修改校驗規則
/**
 * 用於新增分組標識
 *
 * @author cuijiao
 * @date 2018年1月17日
 */
public interface ValidAdd {
}


/**
 * 用於修改分組標識
 *
 * @author cuijiao
 * @date 2018年1月17日
 */
public interface ValidUpdate {
}

po實體類上添加註解時使用指明所述的分組

/**
 * 工單提醒設定
 *
 *
 * @author cuijiao
 * @date 2018年1月16日
 */
public class Remind {
    @NotNull(groups = { ValidUpdate.class })
    private Long id;

    @NotNull(groups = { ValidAdd.class })
    @Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
    private String name;

    // 工單型別+業務型別(唯一索引)
    @NotNull(groups = { ValidAdd.class })
    private Integer wsType;

    @NotNull(groups = { ValidAdd.class })
    private Integer businessType;

    /**
     * (資料字典)緊急程度:普通、緊急、非常緊急
     */
    private Integer urgentLevel;

    @Length(min = 0, max = 50, groups = { ValidAdd.class, ValidUpdate.class })
    private String informTitle;

    @Length(min = 0, max = 255, groups = { ValidAdd.class, ValidUpdate.class })
    private String informContent;
}

啟用校驗
此時啟用校驗和之前的不同,需要指明啟用哪一組規則

 /**
     * 新建提醒設定
     *
     *
     * @param remind
     * @return
     *
     * @author cuijiao
     * @date 2018年1月16日
     */
    @RequestMapping(value = "add", method = RequestMethod.POST)
    public void addRemind(@Validated(value = { ValidAdd.class }) Remind remind) {
      //新增操作
     @Validated(value = { ValidAdd.class }) 表示使用ValidAdd這套校驗規則
        }
    }
   /**
     *
     * 更新提醒設定
     *
     * @param remind
     * @return
     *
     * @author cuijiao
     * @date 2018年1月16日
     */
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public ResponseEntity updateRemind(@Validated(value = { ValidUpdate.class }) Remind remind) {
        // 更新提醒設定
      @Validated(value = { ValidUpdate.class }) 表示使用ValidUpdate這套校驗規則
    }