您的位置 首页 java

入参校验,你还在写if-else?out了!快来看看这个吧

背景

当服务端接口一拿到前台的入参,你是不是上去就开始堆积if-else,十多行代码下去,发现全判断校验参数了,还没进入正常的业务逻辑。虽然功能没啥毛病,但看起来太冗长,被后来者看到,那是免不了一顿吐槽的!想要优雅一点吗?那就一起随小编一起来学习使用spring-boot-starter-validation进行参数校验!

优点

  1. controller层的代码看起来干净整洁
  2. spring-boot-starter-validation本身内置了一些注解可以直接使用,比如@NotNull,@NotBlank,@Size等
  3. 支持自定义注解,灵活方便

搭建

pom引入依赖包

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

常用注解

 @NotNull
@NotBlank
@NotEmpty
@Size 
  

自定义注解

 /**
 * 时间属性格式校验
 * @author:liyajie
 * @createTime:2022/1/20 10:38
 * @version:1.0
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.FIELD})
@Constraint(validatedBy = DateValidator.Validator.class)
public @interface DateValidator {
    // 校验未通过时的返回信息
    String message() default "日期格式不正确";

    // 以下两行为固定模板
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    /**
     * 预期日期格式
     */
    String expectValue();

    @Slf4j
    class Validator implements ConstraintValidator<DateValidator, String> {

        private String expectValue;

        @Override
        public void initialize(DateValidator dateValidator) {
            expectValue = dateValidator.expectValue();
        }

        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            boolean flag = false;
            /**
             * 为空直接通过,只做格式验证
             */
            if(Strings.isNullOrEmpty(value)){
                return true;
            }
            try {
                Date date = DateUtil.formatStr2Date(value, expectValue);
                flag = true;
            }catch (RuntimeException e){
                log.warn("DateValidator 日期格式不正确");
                e.printStackTrace();
            }
            return flag;
        }
    }
}
  

测试

注意点

校验不通过时,会直接抛出异常,程序将停止执行下面的逻辑,这样是不合理的,所以我们要捕获异常,并进行处理,方案如下: 全局捕获异常,并统一返回:

 /**
 * 全局异常处理
 * @author: zhanglei
 * @version: 1.0
 * @date: 2021/5/18 20:27
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 校验异常
     * @author: liyajie
     * @date: 2022/1/20 13:07
     * @param e
     * @return com.lyj.validates.common.R
     * @exception:
     * @update:
     * @updatePerson:
     **/
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public R exceptionHandler(MethodArgumentNotValidException e) {
        log.error("exceptionHandler info:", e);
        BindingResult bindingResult = e.getBindingResult();
        StringBuilder builder = new StringBuilder();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            builder.append(fieldError.getDefaultMessage()).append("!");
        }
        log.error("message : {}",builder.toString());
        return new R("500",builder.toString());
    }
}
  

结束

如需获取源码,请关注后,私信小编,非常感谢!

文章来源:智云一二三科技

文章标题:入参校验,你还在写if-else?out了!快来看看这个吧

文章地址:https://www.zhihuclub.com/185960.shtml

关于作者: 智云科技

热门文章

网站地图