深入了解数据校验:Java Bean Validation 2.0(JSR380)

     我们知道通常情况下程序肯定是分层的,不同的层一般由不同的人来开发。若你是一个有经验的程序员, 我相信你肯定见过在不同的层了都出现了相同的校验代码,这就是某种意义上的垃圾代码。 为了解决这个问题,Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。默认的元数据是各种Java Annotations,当然也支持xml方式并且你也可以扩展~可以说Bean ValidationJavaBean的一个拓展,它可以布局于任意一层代码,不局限于Web应用还是端应用。

Java Bean Validation

    JSR是Java Specification Requests的缩写,意思是Java 规范提案。关于数据校验这块,最新的是JSR380,就是JSR第380号标准。Bean Validation是一个通过配置注解来验证参数的框架,它包含两部分Bean Validation API(规范)和Hibernate Validator(实现)。

 

简单Demo示例
  1. 对Java的最低版本要求是Java 8
  2. 支持容器的校验,通过TYPE_USE类型的注解实现对容器内容的约束:`List<@Email String>`
  3. 支持日期/时间的校验,@Past@Future
  4. 拓展元数据(新增注解):@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent
    1. @Email、@NotEmpty、@NotBlank之前是Hibernate额外提供的,2.0标准后hibernate自动退位让贤并且标注为过期了
  5. Bean Validation 2.0的唯一实现为Hibernate Validator。(其实还有Apache BVal,但是你懂的,forget it)
  6. 对于Hibernate Validator,它自己也扩展了一些注解支持。

所以,对于Java Bean Validation的实现落地产品就没啥好选的,导入Hibernate Validator(最新版本)吧:

  • POM加入
       <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>
  • 编写一个Java Bean
@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);
    }
  • 运行mian函数,控制台打印输出
name名字不能为null: null //  此处错误消息是自己的自定义内容
age必须是正数: -1
emails[2].<list element>不是一个合法的电子邮件地址: aaa.com

常见的验证规则如下:

@AssertFalse   验证boolean类型只能为false
@AssertTrue   验证boolean类型只能为true

其它一些规则详见:

javax.validation.constraints包下

核心API分析

Validation类

    官方给它的定义为:This class is the entry point for Bean Validation.它作为校验的入口,有三种方式来启动,这里主要看最常见的启动方式:

  • 最简单方式:使用默认的ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
  • 可以直接提供一个类型安全ValidationProvider实现。比如HibernateValidator就是一个ValidationProvider的实现:
    HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class)
            // .providerResolver( ... ) // 因为制定了Provider,这个参数就可选了
            .configure()
            .failFast(false);
    ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
    

     

转载于:https://my.oschina.net/u/3242075/blog/3078371

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值