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范围内 |
验证字符串是不是一个有效的电子邮箱 | |
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
在SpringMVC中实现数据校验:hibernate