微信公众号:Java患者
专注Java领域技术分享
Hibernate-Validator介绍
hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现。使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。如果参数不能通过校验,报400错误,请求格式不正确。
在使用hibernate-validator之前,我们需要引入相应的jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.9.Final</version>
</dependency>
相关注解
@Null | 必须为null |
@NotNull | 不能为null |
@AssertTrue | 必须为true |
@AssertFalse | 必须为false |
@Min | 必须为数字,其值大于或等于指定的最小值 |
@Max | 必须为数字,其值小于或等于指定的最大值 |
@DecimalMin | 必须为数字,其值大于或等于指定的最小值 |
@DecimalMax | 必须为数字,其值小于或等于指定的最大值 |
@Size | 集合的长度 |
@Digits | 必须为数字,其值必须再可接受的范围内 |
@Past | 必须是过去的日期 |
@Future | 必须是将来的日期 |
@Pattern | 必须符合正则表达式 |
必须是邮箱格式 | |
@Length | 长度范围 |
@NotEmpty | 不能为null,长度大于0 |
@Range | 元素的大小范围 |
@NotBlank | 不能为null,字符串长度大于0(限字符串) |
@Pattern(regex=) | 字符串必须匹配正则表达式 |
注意:DecimalXX可以对字符串的数字进行校验。
Hibernate-validator使用
假设我们一个更新用户信息的接口,需要使用User对象进行接收参数,并且要求密码不能为空,生日必须是过去的时间。这时可以在User类中给这2个属性加上对应的注解。如:
@NotBlank(message = "密码不能为空")
private String password;
@Past(message = "生日必须是过去的时间")
private Date birthday;
如果需要校验的参数位于请求体中,那么在验证请求参数时,在User user前面加注解 @Valid。
@PutMapping("/{id:\\d+}")
public User update(@RequestBody @Valid User user, BindingResult errors) {
if(errors.hasErrors()) {
// may not be empty错误信息。后面我们会学如何自定义
errors.getAllErrors().stream().forEach(error -> {
FieldError fieldError = (FieldError) error;
String message = fieldError.getField() + error.getDefaultMessage();
System.out.println(message);
});
}
user.setId("1");
return user;
}
当我们参数传过来以后。数据会根据对象中的注解,对数据的合法性进行一个校验,校验后的信息会被封装到一个BindingResult的对象里,作为方法的参数传进来。我们可以利用BindingResult对象包装错误消息放回前端,让他们知道哪些字段有什么错误。
如果对象内部包含另一个对象作为属性,那么我们在对象的属性上加@Valid,可以验证作为属性的对象内部的验证。
自定义校验器
有时候,我们需要对特殊的字段做特定的校验,那么我们就可以自定义校验器。下面我们来创建一个@MyConstraint的校验注解。
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
// 必须要有的三个属性
String message();
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
我们的校验逻辑是写在校验逻辑写在MyConstraintValidator这个类上面,它需要实现ConstraintValidator的接口。
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("初始化做的工作");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return false;
}
}
这个接口需要指定二个泛型,第一个是我们校验的注解类。第二个指定我们要对什么类型进行校验。initialize方法是初始化时候调用的。isValid是校验的时候用的,isValid方法返回true表示校验通过,返回false表示校验不通过。
在Spring的项目中,允许在这个类中注入Spring的东西,如使用@Autowired注解注入Bean对象。
在User类中对username字段使用:
@MyConstraint(message = "这是一个测试")
private String username;
查看