Hibernate Validator是一个基于JSR 380规范的Java Bean验证库,它能够为Java Bean的属性提供各种验证规则,比如非空、长度、邮箱格式等。在本文中,我们将学习如何使用Hibernate Validator进行Java Bean的验证,同时介绍如何自定义校验器注解。
1. 添加Hibernate Validator依赖
首先,我们需要在项目中添加Hibernate Validator的依赖。在Maven项目中,只需要在pom.xml
中添加以下代码:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
在Gradle项目中,可以使用以下代码添加依赖:
dependencies {
implementation 'org.hibernate.validator:hibernate-validator:6.1.0.Final'
}
2. 创建Java Bean
在本例中,我们将创建一个简单的Java Bean,用于存储用户的基本信息。以下是一个示例代码:
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
public class User {
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty(message = "密码不能为空")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
// 省略getter和setter方法
}
以上代码定义了一个User类,并添加了三个属性:username、password和email。在属性上使用了Hibernate Validator提供的注解,用于指定属性的验证规则。
3. 创建校验器
如果要自定义验证规则,需要创建一个自定义的校验器。在本例中,我们将为email属性添加一个自定义的注解@UniqueEmail
,用于验证邮箱是否唯一。以下是一个示例代码:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = UniqueEmailValidator.class)
public @interface UniqueEmail {
String message() default "邮箱已经被注册了";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
在以上代码中,@UniqueEmail
注解使用了Hibernate Validator提供的@Constraint
注解来标识这是一个校验器。同时,@UniqueEmail
注解使用了@Target
注解来指明这个校验器可以用于哪些注解上。在本例中,我们指定了这个校验器可以用于属性和参数上,因此我们可以将这个注解应用到email属性上。
@UniqueEmail
注解还使用了一个validatedBy
属性,在这个属性中指定了这个注解使用的校验器类UniqueEmailValidator
。
接下来,我们需要实现UniqueEmailValidator
类来完成具体的校验逻辑。以下是一个示例代码:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
@Autowired
private UserService userService;
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return !userService.emailIsExist(email);
}
}
UniqueEmailValidator
实现了ConstraintValidator
接口,并指定UniqueEmail
注解作用的类型为String
类型。isValid()
方法中,我们编写具体的校验逻辑,例如在以上代码中我们检查邮箱是否已经被注册。
需要注意的是,在UniqueEmailValidator
中我们可以注入其他的Bean,比如这里我们注入了UserService
,并调用其emailIsExist()
方法查询了数据库中是否已经存在指定的邮箱。
4. 使用校验器
在我们完成自定义的校验器之后,我们可以将这个校验器应用到Java Bean的属性上。在以上示例代码中,我们就将@UniqueEmail
注解应用到了email属性上。同样的,我们也可以将其他的Hibernate Validator提供的注解应用到Java Bean的属性上。在本文示例中,我们使用了@NotEmpty
和@Email
注解。
为了使用校验器,我们需要在代码中调用校验器进行验证。以下是一个示例代码:
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
User user = new User();
user.setUsername("");
user.setPassword("");
user.setEmail("bademail");
Set<ConstraintViolation<User>> violations = validator.validate(user);
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
在以上代码中,我们通过Validation
工厂类构建了一个Validator
实例,并使用这个实例对一个User
对象进行了验证。在validator.validate(user)
方法中,我们调用了Hibernate Validator提供的验证方法,并将返回的结果封装在一个Set
集合中。如果验证通过,这个Set
集合将为空;否则,这个集合中将包含所有验证未通过的错误信息。
5. 总结
以上就是使用Hibernate Validator进行Java Bean的验证,以及自定义校验器注解的完整攻略。在本文中,我们使用了一个简单的Java Bean作为示例,并使用了两个校验器注解:@UniqueEmail
和@Email
。通过这个示例,可以让读者了解到Hibernate Validator的基本使用方式,并学习如何创建自定义校验器注解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Hibernate validator使用以及自定义校验器注解 - Python技术站