Bean Validation-------JAVA BEAN 數據驗證功能java
數據驗證在 Java 分層結構的應用開發中佔據着重要位置。Java EE 6 提出了 Bean Validation 規範,使用註解的方式對 Java Bean 進行約束驗證,不侷限於某一層次或者某一編程模型,靈活易用。而今天,咱們就去學習java中的數據驗證功能之Bean Validation。spring
首先咱們來介紹一下Bean Validation。編程
Bean是java bean,是咱們抽象出來的對象。如用戶對象,這個對象確定包含不少信息,如用戶名,密碼,權限等等信息。在實際的開發中,用戶的登陸驗證,權限控制等是咱們不得不關注的問題。舉個例子,如用戶登陸功能,咱們不但要在前臺執行驗證,在服務層後臺一樣也須要對用戶信息進行驗證。若是咱們每進行一次業務操做,都須要去寫一段驗證的代碼,這樣無疑是很是累贅和易出錯的。api
Bean Validation 規範的目標就是避免多層驗證的重複性。事實上,開發者更傾向於將驗證規則直接放到 Java Bean 自己,使用註解的方式進行驗證規則的設計。app
JSR303 規範(Bean Validation 規範)提供了對 Java EE 和 Java SE 中的 Java Bean 進行驗證的方式。該規範主要使用註解的方式來實現對 Java Bean 的驗證功能,而且這種方式會覆蓋使用 XML 形式的驗證描述符,從而使驗證邏輯從業務代碼中分離出來。學習
接下來簡單學習api和基本用法。因爲springui
Spring 4.0 默認即支持Bean Validation 1.0 (JSR-303)和 Bean Validation 1.1(JSR-349)校驗規範, 同時也能適配Spring的Validator校驗接口。spring提供了數據綁定對象DataBinder,所謂的數據綁定就是自動把用戶輸入的數據自動綁定到咱們用於處理用戶數據邏輯的對象。在Spring中 Validator 和 Binder構成了Validation包.this
首先查看一下spring的validator包下面的包結構編碼
在這個包中第一個要用到的就是Validator接口,該接口提供數據驗證的方法。接下來看一下Vlidator接口的源碼:spa
package org.springframework.validation; public interface Validator { /**是否爲能夠驗證的類型*/ boolean supports(Class<?> clazz); /**數據驗證方法*/ void validate(Object target, Errors errors); }
方法:supports(Class) - 判斷該Validator是否能校驗提供的Class的實例?
方法:validate(Object, org.springframework.validation.Errors) - 校驗給定的對象,若是有校驗失敗信息,將其放入Errors對象。
咱們寫一個簡單的bean,演示一下Validitor接口的使用。
一個article對象,代碼以下:
public class Article { private long id; private String name; private String content; private Date publishTime; private Date lastUpdateTime; private User author; private ArticleType articleType; // ... 省略其餘屬性 // ... omit other attributes // ... omit getter and setter methods }
而後爲article類設置一個校驗器,用來校驗用戶的artile是否知足規則
/** * @Author Wang Weiwei * @Since 16-10-13 * @Describe * The validator of article */ public class ArticleValitors implements Validator { /**this validator is only fit to the article type*/ public boolean supports(Class<?> clazz) { if (Article.class.equals(clazz)){ return true; } return false; } public void validate(Object target, Errors errors) { Article article = (Article) target; ValidationUtils.rejectIfEmptyOrWhitespace(errors,"title","field.required"); ValidationUtils.rejectIfEmptyOrWhitespace(errors,"content","field.required"); if (article.getTitle().length() > 100){ errors.rejectValue("title","too.long.article"); //...omit... } }
ArticleValidator校驗器只能校驗類型爲Article類型的數據對象,且在此對象中title不能爲空,content屬性也不能爲空,title的長度也必須小於100,不然校驗器會報錯,並將錯誤信息存放到errors對象當中。經過這個校驗器咱們就能實現對article類型的簡單的校驗了。
前面咱們談到數據綁定和數據校驗。如何拿到校驗錯誤信息是咱們最後須要討論的一個問題。在上面的例子中,
咱們拒絕了`title`和`content`屬性。若是咱們想要輸出校驗錯誤的提示信息,就要用到校驗失敗時設置的錯誤編碼(本例中就是'title'和'content')。
當你調用`Errors`接口中的`rejectValue`方法或者它的任何一個方法,它的優先實現不單單會註冊做爲參數傳入進來的錯誤編碼,
還會註冊一些遵循必定規則的錯誤編碼。註冊哪些規則的錯誤編碼取決於你使用的`MessageCodesResolver`。當咱們使用默認的`DefaultMessageCodesResolver`
時,除了會將錯誤信息註冊到你指定的錯誤編碼上以外,這些錯誤信息還會註冊到包含屬性名的錯誤編碼上。假如你調用這樣一個方法`rejectValue("title", "too.long.article")`,
Spring除了會註冊`too.darn.old`這個錯誤編碼外,還會註冊`too.darn.old.age`和`too.darn.old.age.int`這兩個錯誤編碼(即一個是包含屬性名,另一個既包含屬性名還包含
類型);這在Spring中做爲一種約定,這樣全部的開發者都能按照這種約定來定位錯誤信息了。
休息一會,等會去寫spring中bean的裝飾器BeanWrapper