hibernate-validator

本文介绍了如何在项目中配置并使用Hibernate Validator进行Bean Validation,包括依赖配置、验证方法、接口验证、实体属性验证以及分组验证。示例中展示了@NotNull、@NotEmpty、@NotBlank和@Length等注解的用法,还提到了分组验证和联级验证的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档

pom.xml依赖配置

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.10.Final</version>
</dependency>

<!--hibernate-validator 6.0.10.Final 的依赖-->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b09</version>
</dependency>

Bean Validation 2.0中提供的验证
这里写图片描述

获取Validator实例

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Validator接口中有三个方法可用于验证,这三个方法都会返回一个Set<ConstraintViolation>集合,当验证通过的情况下,这个集合是空的,若有约束没有验证通过,则会分别为没有验证通过的约束创建ConstraintViolation实例,并添加到Set<ConstraintViolation>集合中

Validator#validate() 对实体进行验证
Validator#validateProperty()对实体中某个属性进行验证
Validator#validateValue()对实体中某个属性的值进行验证

例子
这里写图片描述
这里写图片描述

@NotNull 当值为null时验证不通过
@NotEmpty 当值为null''时验证不通过
@NotBlank 当值为null''' '时验证不通过
@Length(min = 2, max = 10) 当值的长度小于2或大于10时验证不通过
@Min(value = 10) 当值小于10时验证不通过

分组验证
这里写图片描述
这里写图片描述
这里写图片描述
当验证规则未指定分组时,其属于默认分组。
validator.validate(person)未指明使用哪个组时使用默认分组中的规则进行验证

由于Bean Validation支持在一个应用使用多个提供商进行工作,如果超过一个的供应商在类路径下,那么通过buildDefaultValidatorFactory()创建factory是无法保证所使用的是哪个供应商。
在这种情况下,我们可以通过Validation#byProvider()来明确指定使用的是哪个供应商。

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
        .configure()
        .buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

HibernateValidator.class
这里写图片描述
这里写图片描述
这里写图片描述

每个供应商都会包含这样一个文件

META-INF/services/javax.validation.spi.ValidationProvider

这个文件中指定了ValidationProvider实现类的全路径名
Hiberante Validator下这个文件中的内容如下

org.hibernate.validator.HibernateValidator

2018-08-21 联级验证

public class Person {

    @NotBlank(message = "名称不能为空", groups = {ValidatorOne.class})
    @Length(min = 2, max = 10, groups = {ValidatorOne.class})
    private String name;

    @Min(value = 10, message = "年龄最小10岁", groups = {ValidatorOne.class})
    private int age;

    @Valid
    private EmailInfo emailInfo;

    //...
}

public class EmailInfo {

    @Email(message = "邮件格式不正确", groups = {ValidatorOne.class})
    private String email;

    //...
}

验证名称、年龄的同时也验证邮箱格式

 @Test
 public void createPerson() {
     Person person = new Person();
     person.setName("1234560ab");
     person.setAge(9);

     EmailInfo emailInfo = new EmailInfo();
     emailInfo.setEmail("1323");

     person.setEmailInfo(emailInfo);

     Set<ConstraintViolation<Person>> constraintViolationSet = validator.validate(person, ValidatorOne.class);

     assertEquals(2, constraintViolationSet.size());

 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值