Hibernate学习笔记 Hibernate Validator简介

Hibernate项目中不只有ORM一个框架,这里介绍的是它的另外一个框架Validator,用来验证明体类是否知足需求。Validator实现了Java的一项标准Bean Validation。java

若是使用Maven,就须要在pom.xml中添加以下一段,Hibernate须要Java EL表达式,所以须要添加EL的依赖项。web

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>5.3.4.Final</version>
</dependency>
<dependency>
   <groupId>javax.el</groupId>
   <artifactId>javax.el-api</artifactId>
   <version>2.2.4</version>
</dependency>
<dependency>
   <groupId>org.glassfish.web</groupId>
   <artifactId>javax.el</artifactId>
   <version>2.2.4</version>
</dependency>

若是使用Gradle,须要将上面的依赖项转换一下。正则表达式

compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.3.4.Final'
compile group: 'javax.el', name: 'javax.el-api', version: '3.0.1-b04'
compile group: 'org.glassfish.web', name: 'javax.el', version: '2.2.6'

添加依赖以后,就能够在实体类中添加条件注解了。经常使用的几个注解以下:api

注解 做用
AssertTrue 布尔值为真
AssertFalse 布尔值为假
Null 引用为空
NotNull 引用不为空
NotEmpty 字符串引用和值都不是空
Min 数字的最小值
Max 数字的最大值
Past 日期必须是过去
Future 日期必须是将来
Pattern 字符串必须匹配正则表达式
Valid 递归验证引用
Size 验证字符串是否在Size范围内
Email 验证字符串是不是一个有效的电子邮箱
URL 字符串是不是一个有效的URL

须要注意最后两个注解是Hibernate Validator自定义的,假如使用其余的Bean Validation实现,可能没有这两个注解。框架

下面向两个实体类添加了验证注解,其余方法已经省略了。和JPA注解同样,若是验证注解添加到字段上,Hibernate就会直接读取字段的值。若是注解到Getter方法上,Hibernate就会调用方法取得值。在一个类中不要同时应用这两种方式,会致使重复验证的问题。若是在一个集合上应用Valid注解, Hibernate就会递归验证集合中的每个元素。测试

public class Author {
    @NotNull
    @Size(min = 6, max = 15)
    @Pattern(regexp = "([a-zA-Z]+\d*)+")
    private String username;
    @NotNull
    @Size(min = 6, max = 20)
    private String password;
    @NotNull
    private String nickname;
    @Email
    private String email;
    @Min(0)
    private int age;
    @Size(max = 500)
    private String address;
    @Past
    @NotNull
    private Date birthday;
    @Valid
    @NotNull
    private List<Article> articles = new ArrayList<>();
}
public class Article {
    @NotNull
    private String title;
    @NotNull
    private String content;
    @NotNull
    private Author author;
    @Past
    private Date createTime;
    @Past
    private Date modifyTime;
}

向实体类添加了验证注解以后,咱们就能够开始验证了。首先须要构造一个ValidatorFactory,而后使用构造出的ValidatorFactory生成一个Validator,而后调用这个Validator的validate方法,就能够验证明体类了。validate方法会返回一个Set,每个ConstraintViolation都是一个验证结果,若是实体类没有错误,那么这个集合的大小就是0,表示验证经过。若是存在错误,咱们就能够经过这个集合来查看存在什么错误。ui

public class ValidatorTest {
    private static ValidatorFactory factory;
    private static Validator validator;
    private static Logger logger;

    @BeforeClass
    public static void init() {
        factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
        logger = LoggerFactory.getLogger(ValidatorTest.class);
    }

    @AfterClass
    public static void clean() {
        factory.close();
    }

    @Test
    public void testKindsOfErrors() {
        Author author = new Author();
        author.setUsername("123");
        author.setPassword("1234");
        author.setAddress("");
        author.setEmail("");
        author.setArticles(null);
        author.setAge(-20);
        Set<ConstraintViolation<Author>> set = validator.validate(author);
        for (ConstraintViolation<Author> c : set) {
            logger.info(c.toString());
        }
    }

    @Test
    public void testAllRight() {
        Author author = new Author();
        author.setUsername("yitian");
        author.setPassword("12345678");
        author.setAddress("");
        author.setNickname("");
        author.setEmail("yitian@yitian.com");
        author.setBirthday(new Date());
        Set<ConstraintViolation<Author>> set = validator.validate(author);
        for (ConstraintViolation<Author> c : set) {
            logger.info(c.toString());
        }
        Assert.assertEquals(0, set.size());
    }

    @Test
    public void testOneProperty() {
        Author author = new Author();
        author.setUsername("yitian");
        Set<ConstraintViolation<Author>> set = validator.validateProperty(author, "username");
        for (ConstraintViolation<Author> c : set) {
            logger.info(c.toString());
        }
    }

    @Test
    public void testCustomMessage() {
        Article article = new Article();
        LocalDate date = LocalDate.of(2099, 1, 1);
        article.setModifyTime(Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()));
        Set<ConstraintViolation<Article>> set = validator.validateProperty(article, "modifyTime");
        for (ConstraintViolation<Article> c : set) {
            logger.info(c.toString());
        }
    }
}

以上就是一个简单的验证的例子。经过这个例子,你们应该明白了Hibernate Validator的基本内容。不少框架好比Spring也提供了相关的内容,能方便的将Hibernate Validator整合到项目中。若是但愿了解更多信息,能够查看一下它们的相关文档。这里就起到一个抛砖引玉的做用。spa

传智的笔记

1.1. 数据校验

在SpringMVC中实现数据校验:hibernate

 

1.1.1. 在POJO中添加校验规则

 

1.1.2. 在Controller中添加校验注解

 

1.1.3. 测试

 

相关文章
相关标签/搜索