咱们知道一般状况下程序确定是分层的,不一样的层通常由不一样的人来开发。若你是一个有经验的程序员, 我相信你确定见过在不一样的层了都出现了相同的校验代码,这就是某种意义上的垃圾代码。 为了解决这个问题,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();