Springboot 接口校验

26 阅读1分钟

接口参数校验:减少if等着逻辑中判空等操作

依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

springboot中使用

  1. 注解标注 接口入参实体中直接使用注解,也可以直接在接口入参上使用注解

        @Null(message ="appId is null" ) // message校验不通过的提示
        private String appId;
    
  2. 入参开启校验

    public Result<NormalVO> normal(@Validated UserReq vo) {
             return Result.success(vo);
    }
    
  3. 统一的校验失败返回值

@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);
}
​
​