介绍Java中的接口数据校验,通常使用的是验证框架Hibernate Validator。我们可以使用它来验证javabean实例的数据是否合法。
安装 Hibernate Validator
在Maven中,我们可以使用以下代码引入Hibernate Validator:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
注意:hibernate-validator.version
应该替换成正确的版本号。
定义验证约束
使用Hibernate Validator,我们可以使用注解来定义校验约束,下面是一些常见的注解:
- @NotNull —— 检查是否为null。
- @NotEmpty —— 检查是否为空(
“”
),或者长度为0的字符串。 - @Size —— 检查字符串的长度是否在一个包含最小值和最大值的区间内。
- @Min —— 检查数值是否大于等于指定的值。
- @Max —— 检查数值是否小于等于指定的值。
- @Positive —— 检查数值是否为正数。
- @Negative —— 检查数值是否为负数。
- @Email —— 检查是否为邮箱地址。
示例1
我们来看一个简单的示例,验证一个学生对象是否符合我们的校验规则:
public class Student {
@NotNull
@Size(min = 2, max = 30)
private String name;
@NotNull
@Positive
private Integer age;
@NotNull
private String gender;
@NotNull
@Email
private String email;
// getters/setters omitted
}
在上面的代码中,我们定义了一个Java bean实体类Student
,并在属性上添加了一些校验约束注解。简单解释一下这些注解的含义:
@NotNull
—— 这个注解表示该字段不能为空(也就是不能为null),如果该字段为null,将会引发异常。@Size(min = 2, max = 30)
—— 这个注解表示该字段的长度必须在2到30之间(包含2和30),如果该字段长度不在这个区间内,则会引发异常。@Positive
—— 这个注解表示该字段必须是正数,如果该字段不是正数,则会引发异常。@Email
—— 这个注解表示该字段必须是一个合法的邮箱地址,如果该字段不是一个合法的邮箱地址,则会引发异常。
以上约束注解可以根据实际需求进行增加、删除或修改。
我们可以使用如下方法,检验一个学生对象是否符合上面的约束要求:
public static void main(String[] args) {
Student student = new Student();
student.setName("Tom");
student.setAge(18);
student.setGender("male");
student.setEmail("tom@test.com");
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
Set<ConstraintViolation<Student>> violations = validator.validate(student);
for (ConstraintViolation<Student> violation : violations) {
System.out.println(violation.getMessage());
}
}
我们将Student
对象传递给Validator
的validate()
方法,这将返回一个Set
集合,该集合包含了所有未通过验证的验证约束对象的信息,例如age
字段值不能为null和不能为负数。
示例2
在下面的示例中,我们使用一个list进行数据更新。我们可以验证其中的join时间是否符合需求:
```java
public class Book {
@NotNull
private String name;
private Integer pageCount;
@NotNull
@ISODate
private LocalDateTime publishDate;
@NotNull
@ISODateTime
private LocalDateTime joinTime;
set/get omitted
}
我们在`joinTime`字段上定义了一个注解`@ISODateTime`,这个注解表示该字段必须是一个符合ISO 8601日期时间格式的字符串。下面是`@ISODateTime`注解的定义:
```java
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ISODateTimeValidator.class)
public @interface ISODateTime {
String message() default "Invalid ISO date time format";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
注意:ISODateTimeValidator
是一个自定义校验器,是我们自己编写的,下面将详细介绍如何编写自定义的校验器。
我们再来看一个示例,这个示例演示了如何使用@ISODate
和@ISODateTime
注解来验证日期和时间:
public static void main(String[] args) {
List<Book> bookList = new ArrayList<>();
Book book1 = new Book();
book1.setName("Java Basic");
book1.setPageCount(200);
book1.setPublishDate(LocalDateTime.of(2019, 1, 1, 0, 0, 0));
book1.setJoinTime(LocalDateTime.now().plusMonths(1));
bookList.add(book1);
Book book2 = new Book();
book2.setName("Java Advanced");
book2.setPageCount(300);
book2.setPublishDate(LocalDateTime.of(2018, 6, 1, 0, 0, 0));
book2.setJoinTime(LocalDateTime.of(2021, 1, 1, 0, 0, 0));
bookList.add(book2);
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
for (Book book : bookList) {
Set<ConstraintViolation<Book>> violations = validator.validate(book);
for (ConstraintViolation<Book> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
在上面的示例中,我们首先创建了一个Book
的list,然后为其中的两本书设置了不同的属性。我们将Book
对象传递到Validator
的validate()
方法中,对每本书进行校验。
编写自定义校验器
我们可以编写自己的校验器来实现不同类型的校验规则。下面是一个简单的示例,展示了如何自定义校验器来验证日期时间格式:
public class ISODateTimeValidator implements ConstraintValidator<ISODateTime, String> {
private Pattern pattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$");
@Override
public void initialize(ISODateTime isoDateTime) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
if (!pattern.matcher(value).matches()) {
return false;
}
try {
LocalDateTime.parse(value);
return true;
} catch (DateTimeParseException e) {
return false;
}
}
}
在上面的示例中,我们定义了一个ISODateTimeValidator
校验器,它实现了ConstrainValidator<ISODateTime, String>
接口。我们需要指定两个泛型,分别是我们自己定义的约束注解类型和我们需要进行验证的值类型。这里我们定义了一个正则表达式,用来校验日期时间格式是否符合要求。如果值符合要求,则将返回true
。
注意:我们必须实现initialize()
方法,但该方法不需要内容。另外,在实现isValid()
方法时,我们需要返回一个布尔类型的值,如果验证通过则返回true
,否则返回false
,并记录有错误的信息。所有错误信息会在调用validate()
方法时传递给调用者。
总结
使用Hibernate Validator可以轻松地验证Java bean对象的数据。上面示例中的注解只是Hibernate支持的所有注解类型的一小部分。如果需要使用不同的注解或编写自己的自定义验证器,可以通过在Java bean对象的属性上添加注解来自定义验证规则,或通过编写自定义的注解来实现自定义校验器。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:五分钟带你了解Java的接口数据校验 - Python技术站