展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

beanvalidation简介

  • beanvalidation官网 -> 是规范,api,接口

  • hibernate-validator官网 -> 是beanvalidation的最佳实现

  • java EE规范

不相关的很多java package组成了javaee规范;api(没有实现),具体是由不同的厂商来实现这些规范的

# javax开头的包
  javax.sql----mysql,sqlserver,oracle
  javax.jms--- activemq
  javax.servlet---tomcat,jetty
  javax.persistence----hibernate
  javax.transaction----分布式事务
  javax.xml----jaxp: java api for xml processing

# 并不是只有这么多,而是jdk默认带了一些常用的javaee规范。对于没有带的,如果要使用,就要自己引入了,比如beanvalidation
  • 该规范由jcp里面的成员制定

  • jcp官网

  • 在该组织中提出JavaSpecification Requests java规范提案,如beanvalidation的提案有如下3个

提案号 beanvalidation版本
jsr303 beanvalidation 1.0
jsr349 beanvalidation 1.1
jsr380 beanvalidation 2.0
  • javax会逐渐走向jakarta,oracle把javaee规范捐献给eclipse基金会,javax会逐渐改名为jakarta

  • 不要将apache的jakarta与当前Jakarta混淆

  • apache的jakarta在2011退休了

  • 搭建项目

    <!--引入beanvalidation-->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>
    <!--jakarta规范的版本,和javax版本内容一样,就是包名不同-->
<!--    <dependency>-->
<!--      <groupId>jakarta.validation</groupId>-->
<!--      <artifactId>jakarta.validation-api</artifactId>-->
<!--      <version>2.0.1</version>-->
<!--    </dependency>-->
    <!--引入hibernate-validator-->
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.18.Final</version>
    </dependency>
    <!--el 规范和tomcat的实现,用于解析messages里面的表达式-->
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-el</artifactId>
      <version>9.0.29</version>
    </dependency>
  • 传统校验方式
public class UserInfo {
    
    private Long id;
  
    private String name;
   
    private Integer age;
  
    private String email;
   
    private String phone;
   
    private LocalDateTime birthDay;
   
    private String personalPage;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public LocalDateTime getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(LocalDateTime birthDay) {
        this.birthDay = birthDay;
    }

    public String getPersonalPage() {
        return personalPage;
    }

    public void setPersonalPage(String personalPage) {
        this.personalPage = personalPage;
    }

}
  • 测试
public class ValidationTest {

    public static void main(String[] args) {
        UserInfo userInfo = new UserInfo();
        test1(userInfo);
    }

    // 使用传统的方式来校验bean
    private static void test1(UserInfo userInfo) {
        String name = userInfo.getName();
        if (name == null || "".equals(name) || "".equals(name.trim())) {
            //不符合校验规则
            throw  new RuntimeException("name不符合校验规则");
        }
        //age的校验
        Integer age = userInfo.getAge();
        boolean ageValidate = age > 1 && age < 800;
        if (!ageValidate) {
            throw  new RuntimeException("age不符合校验规则,应在(1-800)");
        }
        // ......
    }

}
  • 使用Validator
public class ValidationUtil {
    // 线程安全
    private static Validator validator;
   
    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    public static List<String> valid(UserInfo userInfo){
        // 如果被校验对象userInfo没有校验通过,则set里面就有校验信息
        Set<ConstraintViolation<UserInfo>> set = validator.validate(userInfo);
        List<String> list = set.stream().map(v -> "属性:" + v.getPropertyPath() +
                ",属性的值:"
                + v.getInvalidValue() + ",校验不通过的提示信息:" + v.getMessage()) 
                .collect(Collectors.toList());
        return list;
    }

}
  • 测试
public class UserInfo {
    @NotNull
    private String name;
}

public class ValidationTest {
    public static void main(String[] args) {
        UserInfo userInfo = new UserInfo();
        List<String> list = ValidationUtil.valid(userInfo);
        System.out.print(list);
    }
}
  • 内置约束
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null
@NotEmpty 被注释的集合(size>0)/字符串(!=null&&!"")
@NotBlank !=null&&!""&&!"   "
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,>=
@Max(value) 被注释的元素必须是一个数字,<=
@DecimalMin(value)  >=
@DecimalMax(value) <=
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@PastOrPresent 时间
@NegativeOrZero <=0
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
@Email 被注释的元素必须是电子邮箱地址
  • 附加约束
@Length 被注释的字符串的大小必须在指定的范围内
@Range 被注释的元素必须在合适的范围内
@URL 一个url
  • 案例
public class UserInfo {

    private Long id;

//    @NotNull // 只校验不为null
//    @NotEmpty // !=null&&!""
    @NotBlank(message = "你的名字不能为空") // !=null&&!""&&!"   "
    private String name;

    @NotNull
//    @Min(1) @Max(800)  // 闭区间,什么时候生效?!=null
//    @Range(min = 1,max = 800) // 闭区间
    @Min(value = 18,message = "年龄小于{value}岁,禁止进入")
    private Integer age;

    @NotBlank
    @Email
    private String email;

    @Pattern(regexp = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$")
    private String phone;

    @NotNull
    @Past  // 不能是未发生的时间
    private LocalDateTime birthDay;

    @URL
    private String personalPage;
posted @ 2022-10-05 14:21  DogLeftover  阅读(39)  评论(0)    收藏  举报