咱們知道一般狀況下程序確定是分層的,不一樣的層通常由不一樣的人來開發。若你是一個有經驗的程序員, 我相信你確定見過在不一樣的層了都出現了相同的校驗代碼,這就是某種意義上的垃圾代碼。 爲了解決這個問題,Bean Validation
爲 JavaBean
驗證定義了相應的元數據模型和 API。默認的元數據是各類Java Annotations
,固然也支持xml方式而且你也能夠擴展~能夠說Bean Validation
是JavaBean
的一個拓展,它能夠佈局於任意一層代碼,不侷限於Web應用仍是端應用。java
Java Bean Validation程序員
JSR是Java Specification Requests
的縮寫,意思是Java 規範提案。關於數據校驗這塊,最新的是JSR380
,就是JSR第380號標準。Bean Validation
是一個經過配置註解來驗證參數的框架,它包含兩部分Bean Validation API
(規範)和Hibernate Validator
(實現)。apache
@Past
和@Future
@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent
@Email、@NotEmpty、@NotBlank
以前是Hibernate額外提供的,2.0標準後hibernate自動退位讓賢而且標註爲過時了Bean Validation 2.0
的惟一實現爲Hibernate Validator
。(其實還有Apache BVal
,可是你懂的,forget it)Hibernate Validator
,它本身也擴展了一些註解支持。因此,對於Java Bean Validation
的實現落地產品就沒啥好選的,導入Hibernate Validator
(最新版本)吧:tomcat
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> <version>8.5.29</version> <!--<scope>provided</scope> 打包時最用此scope--> </dependency>
@Getter @Setter @ToString public class Person { // 錯誤消息message是能夠自定義的 @NotNull(message = "名字不能爲null") public String name; @Positive public Integer age; @NotNull @NotEmpty private List<@Email String> emails; @Future private Date start; }
public static void main(String[] args) { Person person = new Person(); //person.setName("fsx"); person.setAge(-1); // email校驗:雖然是List均可以校驗哦 person.setEmails(Arrays.asList("fsx@gmail.com", "baidu@baidu.com", "aaa.com")); //person.setStart(new Date()); //start 須要是一個未來的時間: Sun Jul 21 10:45:03 CST 2019 //person.setStart(new Date(System.currentTimeMillis() + 10000)); //校驗經過 // 對person進行校驗而後拿到結果(顯然使用時默認的校驗器) 會保留下校驗失敗的消息 Set<ConstraintViolation<Person>> result = Validation.buildDefaultValidatorFactory().getValidator().validate(person); // 對結果進行遍歷輸出 result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()) .forEach(System.out::println); //用hibernateValidator HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class) .configure() .failFast(false); ValidatorFactory validatorFactory = configuration.buildValidatorFactory(); Set<ConstraintViolation<TestBean>> sets= validatorFactory.getValidator().validate(person); sets.stream().map(v->v.getPropertyPath()+" " +v.getMessage()+":"+v.getInvalidValue()).forEach(System.out::println); }
name名字不能爲null: null // 此處錯誤消息是本身的自定義內容 age必須是正數: -1 emails[2].<list element>不是一個合法的電子郵件地址: aaa.com
常見的驗證規則以下:安全
@AssertFalse 驗證boolean類型只能爲false
@AssertTrue 驗證boolean類型只能爲true
其它一些規則詳見:框架
javax.validation.constraints包下
官方給它的定義爲:This class is the entry point for Bean Validation.
它做爲校驗的入口,有三種方式來啓動,這裏主要看最多見的啓動方式:ide
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
ValidationProvider
實現。好比HibernateValidator
就是一個ValidationProvider
的實現: HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class) // .providerResolver( ... ) // 由於制定了Provider,這個參數就可選了 .configure() .failFast(false); ValidatorFactory validatorFactory = configuration.buildValidatorFactory();