文章目录
1️⃣ Validator
1.1 使用场景
提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的操作,为了避免出现一些错误的数据等,一般需要对数据进行校验,随着接口的增多,校验逻辑的冗余度也越来越大,虽然可以通过抽象出校验的方法来处理,但还是需要每次手动调用校验逻辑
1.1.1 验证模式
- 普通模式(默认)
会校验完所有的属性,然后返回所有的验证失败信息 - 快速失败返回模式
只要有一个验证失败,则返回此条验证失败信息
1.1.2 Validator 配置
默认工厂
Validation.buildDefaultValidatorFactory().getValidator()
@Configuration
public class ValidatorConfiguration {
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
// true-快速失败返回模式 false-普通模式
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
return validatorFactory.getValidator();
}
}
1.1.3 分组配置
- 在实体字段上分组 groups=InterfaceA.class
1.1.4 国际化
1.1.5 声明和验证Bean
-
字段级别约束 : bean-validator直接访问变量不需要getter
-
属性级别约束 : 标准的java bean(拥有setget), 注解可以放在get方法上,不是set
-
类别级约束 : 自定义约束
-
约束是可以继承的
-
可以使用@Valid校验对象图 (成员变量是对象)
-
创建自定义约束注解
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web包中已经包含了Hibernate-Validator 依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
<scope>compile</scope>
</dependency>
使用方法 1 (缺点:每个方法需要+BindingResult参数)
@Valid
注解用于校验,所属包为:javax.validation.Valid。
使用过程:
验证传进controller的对象属性是否有错
①.Girl实体类成员变量需要添加充当校验条件的注解,如:@Min
@Min(value = 18 , message = "未满18岁不可访问")
private Integer age;
②.其次在controller层的方法的要校验的参数上添加@Valid注解
@PostMapping(value = "/girls")
//!!!!需要加@Valid注解
// SpringBoot会自动将异常错误信息绑定到该参数上BindingResult
public Object addGirl(@Valid Girl girl,BindingResult br) {
Result result = new Result("addGirl_Error", 0, false);
if (br.hasErrors()){
//需要处理没验证通过的结果,错误信息返回
result.setMessage(br.getFieldError().getDefaultMessage());
return result;
}
try {
result.setResult(commandService.addGirl(girl));
result.setType("addGirl_ACK");
return result;
} catch (Exception e) {
logger.error("添加女生失败", e);
result.setCode(-3);
return result;
}
}
@Validated
是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能
使用方法 2
不添加BindingResult br
,抛出异常交给全局异常类处理
使用方法 3
实体
@NotNull(message = "id不能为空")
private Integer id;
@Range(min=0,max=3,message="type需要在0-3之间")
private Integer type;
import lombok.Data;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 校验工具类
* <p>
* ValidationResult result = ValidationUtils.validateEntity(obj); // 校验实体
* ValidationResult result = ValidationUtils.validateProperty(obj,"name")//校验属性;
* result.isHasErrors();//是否有错误
* result.getErrorMessage();//取得错误信息
*
* @author zhaojy
*/
public class ValidationUtils {
/**
* 默认校验工厂 生产的 validator
* 也可以通过博客中 配置类注入
*/
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 对 整个 对象进行校验
*
* @param <T>object 对象
* @return ValidationResult 校验结果
*/
public static <T> ValidationResult validateEntity(T object) {
ValidationResult result = new