Java下對輸入的校驗主要是基于jsr303(jsr 380)通過對bean的field加校驗注解,就可以讓框架自動對bean校驗。并且Java自帶的校驗注解和hibernate的校驗注解拙徽,基本上把基本的校驗覆蓋了刨沦,非常方便缤底。
使用中敏释,我碰到這樣一個問題
class User {
@NotEmpty
@UserExist
String username;
@NotEmpty
String address;
}
對輸入的User對象骂澄,需要校驗username不為空,并且username在系統(tǒng)中存在挣柬,這里的@UserExist是自定義的校驗注解潮酒,通過查詢數(shù)據(jù)庫校驗用戶是否存在。
問題是如果username為空邪蛔,Java會執(zhí)行@NotEmpty
和@UserExist
兩個校驗急黎,但是實際開發(fā)中,是不允許空用戶名存在的侧到,所以執(zhí)行了NotEmpty
后勃教,就應(yīng)該停止校驗,這樣可以減少一次用戶數(shù)據(jù)表的訪問匠抗,類似連續(xù)&&
的短路機制故源。
對于這個問題,jsr303已經(jīng)有現(xiàn)成的方法戈咳,通過定義注解執(zhí)行順序心软,可以解決這個問題:
@GroupSequence({User.class, Second.class, Third.class})
class User {
@NotEmpty
@UserExist(groups = Second.class)
String username;
@NotEmpty
String address;
}
Second和Third是一個marker interface,本身沒有任何意義著蛙,在這里僅作為排序符號删铃。
改成這樣后,如果username為空踏堡,就會直接退出校驗猎唁,從而避免無意義執(zhí)行UserExist校驗。
參考: