最佳实践-springboot参数校验效率提升

背景

随着语法糖或者工具包集成越来越多,现在参数校验已经不需要像往常那样写一大串的ifelse判断逻辑了。

常用的就有springboot中validation的引入大大的减少了工作量。

一般就是在实体类中添加 @NotNull等注解,再在入口处添加@Validated 的方式实现参数校验。这其中其实还可以偷懒,就是利用aop,全局进行参数校验,再统一增强返回,就不需要一个一个的加@Validated 了。

全局参数校验

 public static <T> void postMethodException(T t) {
        if (t == null) {
            return;
        }
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<T>> violations = validator.validate(t);
        String errorMsg = violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining("&"));
        if (StringUtils.isNotBlank(errorMsg)) {
            throw new PrescriptionException(ResultEnum.INPUT_PARAM_ERROR.getCode(), errorMsg);
        }
    }

    /**
     * 全局异常捕获
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseResult<?> otherException(Exception e) {
        log.error("catch other exception, e:", e);
        return ResponseResultUtil.failure("系统异常", ResultEnum.FAILURE.getCode(), e.getMessage());
    }

}

这是aop中部分代码贴图,不知道大家有没有发现问题,其中
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

会导致校验效率十分低下,因为会频繁的new 工厂对象,导致gc频繁,造成性能瓶颈。

解决办法

办法很简单。

public class ValidationUtils {

    private static Validator validator = Validation
            .byProvider(HibernateValidator.class)
            .configure()
            .failFast(true)
            .buildValidatorFactory()
            .getValidator();


    public static <T> void validate(T obj) {
        validator.validate(obj);
    }

}

既然知道了原因,那就不要让它一直创建就好了。

一条小咸鱼