接口参数校验:减少if等着逻辑中判空等操作
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
springboot中使用
-
注解标注 接口入参实体中直接使用注解,也可以直接在接口入参上使用注解
@Null(message ="appId is null" ) // message校验不通过的提示 private String appId; -
入参开启校验
public Result<NormalVO> normal(@Validated UserReq vo) { return Result.success(vo); } -
统一的校验失败返回值
@RestControllerAdvice // 异常拦截器
public class GlobalValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) // 返回的响应码,根据情况选择,有的项目异常也算正常响应
public Result<?> handleValidationExceptions(MethodArgumentNotValidException ex) {
String errorMessage = "参数校验失败";
if (!ex.getBindingResult().getFieldErrors().isEmpty()) {
FieldError firstError = ex.getBindingResult().getFieldErrors().get(0);
errorMessage = firstError.getDefaultMessage();
}
return Result.error(errorMessage);
}
}
分组校验功能:用于同一个实体在不同业务中不同校验
@Validated(AddValidGroup.class) // 接口校验时添加分组
// 同一个字段可以添加不同校验规则,同时也可以指定校验分组
@Null(groups = AddValidGroup.class, message = "新增时ID必须为null")
@NotNull(groups = UpdateValidGroup.class, message = "修改时员工ID不能为空")
自定义校验规则 : 参考某个注解源码实现 , 自定义校验规则==>自定义注解( @Constraint(validatedBy = {定义的校验规则.class}) )
// Max注解定规则实现
public abstract class AbstractMaxValidator<T> implements ConstraintValidator<Max, T> { // 实现ConstraintValidator接口
protected long maxValue;
public AbstractMaxValidator() {
}
// 必须实现的方法,初始化自定义好的校验规则
public void initialize(Max maxValue) {
this.maxValue = maxValue.value();
}
// 实际调用的规则
public boolean isValid(T value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null) {
return true;
} else {
return this.compare(value) <= 0;
}
}
protected abstract int compare(T var1);
}