java bean 校驗validation
阿新 • • 發佈:2019-02-20
引數校驗是我們程式開發中必不可少的過程。為了保持程式的健壯性,需要對資料進行校驗。
簡單的校驗
在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());
}
- 關聯校驗
在一個有關聯關係的欄位或者屬性上標註 @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正則,校驗就會失敗
- 分組校驗
定義兩個空介面,分別代表物件的增加校驗規則和修改校驗規則
/**
* 用於新增分組標識
*
* @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這套校驗規則
}