JSR / Bean Valiadation 与 Hibernate Validation、Spring Valiadation
JSR规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现。
而hibernate validation是对这个规范的实践,提供相应的实现,并增加一些其他校验注解,如@Email,@Length,@Range等等,位于org.hibernate.validator.constraints包下。
spring对hibernate validation进行二次封装,显示校验validated bean时,可以使用spring validation或hibernate validation;
而spring validation另一特性:便是其在springmvc模块中添加自动校验,并将校验信息封装进特定的类中。
@Valid和@Validated 区别
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种)。
javax提供了@Valid,配合BindingResult可以直接提供参数验证结果(标准JSR-303规范)。
@Validated对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同
分组
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。
@Valid:没有分组校验的功能。
注解作用域
@Validated:用在类型、方法和方法参数上(类, 方法, 参数)。但不能用于成员属性。
@Valid:可以用在方法、构造函数、方法参数和成员属性上(方法, 构造器, 参数,字段, 泛型),可以用@Valid实现嵌套验证
BindingResult
BindingResult用在实体类校验信息返回结果绑定。
该类作为方法入参,要写在实体对象后面。
@PostMapping("/menus")
public Result addMenu(@RequestBody @Valid Menu menu, BindingResult result) {}
Spring Boot 校验注解应用
配置
@Configuration
public class ValidatorConfig {
// 遇到第一个错误后立即返回,而不是遍历完全部错误
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.addProperty("hibernate.validator.fail_fast", "true") //快速验证模式,有第一个参数不满足条件直接返回
.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setValidator(validator());
return postProcessor;
}
}
————————————————
自定义参数格式校验
校验注解定义
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Constraint(validatedBy = VersionValidator.class)
public @interface VersionValid {
// 自行定义的值
String[] values();
// 错误信息
String message() default "版本号无效";
// 分组验证
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint
用于处理验证逻辑,根据根据自己的业务需求来完成验证的逻辑。
校验处理器实现
public class VersionValidator implements ConstraintValidator<VersionValid,Object> {
private String[] values;
// 初始化方法
@Override
public void initialize(VersionValid versionValidator) {
this.values = versionValidator.values();
}
// 验证的逻辑方法,返回true,则验证通过,否则则不通过。
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
Boolean isFlag = false;
for (int i = 0; i < values.length; i++){
// 存在一致就跳出循环
if (values[i] .equals(value)){
isFlag = true;
break;
}
}
return isFlag;
}
}
ConstraintValidator接口
校验逻辑接口:有两个泛型,第一个是自定义的注解类,第二个就是要验证的数据的类型
使用及校验异常处理
自定义数据权限校验注解
可按上述完成数据权限校验注解的实现
评论区