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. 測試

 

相關文章
相關標籤/搜索