Hibernate Validator 是一个用于 Java 的 Bean Validation 实现,它基于 JSR 380(Java Specification Requests 380)标准。通过使用注解,可以在 Java 对象的字段上定义验证规则,从而在数据持久化之前进行验证。
@NotNull
, @Size
, @Pattern
等,同时也支持自定义验证注解。Hibernate Validator 提供了多种内置的验证注解,常见的包括:
@NotNull
:确保字段不为空。@NotEmpty
:确保集合、数组或字符串不为空。@Min
和 @Max
:确保数值在指定范围内。@Pattern
:确保字段符合正则表达式。Hibernate Validator 广泛应用于各种需要数据验证的场景,如:
假设我们有一个 User
实体类,其中包含 firstName
和 lastName
字段,我们希望至少有一个字段不为空。
直接使用 @NotNull
或 @NotEmpty
注解无法实现至少有一个字段不为空的验证。
我们可以使用自定义验证注解和验证器来实现这一需求。
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = AtLeastOneFieldNotNullValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AtLeastOneFieldNotNull {
String message() default "At least one field must not be null";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AtLeastOneFieldNotNullValidator implements ConstraintValidator<AtLeastOneFieldNotNull, Object> {
@Override
public void initialize(AtLeastOneFieldNotNull constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return true; // 如果整个对象为空,通常由其他验证器处理
}
try {
String firstName = (String) value.getClass().getMethod("getFirstName").invoke(value);
String lastName = (String) value.getClass().getMethod("getLastName").invoke(value);
return (firstName != null && !firstName.isEmpty()) || (lastName != null && !lastName.isEmpty());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
import javax.validation.constraints.NotNull;
@AtLeastOneFieldNotNull
public class User {
@NotNull
private String firstName;
@NotNull
private String lastName;
// Getters and setters
}
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
public class Main {
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
User user = new User();
user.setFirstName(null);
user.setLastName(null);
Set<ConstraintViolation<User>> violations = validator.validate(user);
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
通过上述方法,我们可以实现至少有一个字段不为空的验证需求。
领取专属 10元无门槛券
手把手带您无忧上云