[java]61、hibernate-validator
1、基本使用
1.1、介绍
hibernate-validator
是 java中常用的一款后端校验框架
1、在pom.xml
中添加如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1.2、方法Model参数校验
@Data
public class DictItem {
@NotBlank(message = "名称不能为空")
private String name;
@NotBlank(message = "值不能为空")
private String value;
}
Model
使用方法
1、在
Model
的getter
或成员变量上加相关的校验注解2、在
Model
参数上加@Valid
的注解校验失败时,会抛出异常
org.springframework.validation.BindException
可以通过
BindException.getBindingResult().getAllErrors()
拿到所有的错误信息
1.3、方法的非Model
参数校验
@Validated
public abstract class BaseController<T> {
@PostMapping("/remove")
public R remove(@NotBlank(message = "id不能为空") String id) {
}
}
使用方法
1、在Controller
上加@Validated
注解
2、在非Model
参数上加相关的校验注解
校验失败时,会抛异常
javax.validation.ConstraintViolationException
可以通过ContraintViolationException.getConstraintViolations()
拿到所有的错误信息
1.4、异常捕获
@RestControllerAdvice
@Slf4j
public class CommonExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public void handle(Throwable t) {
log.error(null, t);
}
}
2、常见注解
1、@Valid
:被注释的元素是一个对象,需要检查此对象的所有字段值
2、@Null
:被注释的元素必须为 null
3、@NotNull
:被注释的元素必须不为 null
4、@AssertTrue
:被注释的元素必须为 true
5、@AssertFalse
:被注释的元素必须为 false
6、@Min(value)
:被注释的元素必须是一个数字,其值必须大于等于指定的最小值
7、@Max(value)
:被注释的元素必须是一个数字,其值必须小于等于指定的最大值
8、@DecimalMin(value)
:被注释的元素必须是一个数字,其值必须大于等于指定的最小值
9、DecimalMax(value)
:被注释的元素必须是一个数字,其值必须小于等于指定的最大值
10、@Size(max, min)
:被注释的元素的大小必须在指定的范围内
11、@Digits (integer, fraction)
:被注释的元素必须是一个数字,其值必须在可接受的范围内
12、@Past
:被注释的元素必须是一个过去的日期
13、@Future
:被注释的元素必须是一个将来的日期
14、@Pattern(value)
:被注释的元素必须符合指定的正则表达式
15、@Email
:被注释的元素必须是电子邮箱地址
16、@Length
:被注释的字符串的大小必须在指定的范围内
17、@NotEmpty
:被注释的字符串的必须非空
18、@Range
:被注释的元素必须在合适的范围内
19、@NotBlank
:被注释的字符串的必须非空
20、@URL(protocol=,host=, port=,regexp=, flags=)
:被注释的字符串必须是一个有效的url
21、@CreditCardNumber
:被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性
3、自定义校验
1、检测某个值是布尔类型
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = BoolNumber.BoolNumberValidator.class)
public @interface BoolNumber {
String message() default "只能是0和1";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class BoolNumberValidator implements ConstraintValidator<BoolNumber, Short> {
@Override
public boolean isValid(Short aShort, ConstraintValidatorContext constraintValidatorContext) {
return aShort == null || aShort == 0 || aShort == 1;
}
}
}
使用方式
@BoolNumber( message = "disabled只能是0和1")
private Integer disabled;
4、快速失败
默认情况下是检测完所有的错误后在统一抛出异常
也可以设置快速失败:只要检测到一个错误,就直接抛出异常,步子啊往下检测
@Configuration
public class ValidatorCfg {
@Bean
public Validator validator() {
return (Validator) Validation
.byProvider(HibernateValidator.class)
.configure()
.failFast(true)
.buildValidatorFactory().getValidator();
}
}