最佳实践-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);
}
}
既然知道了原因,那就不要让它一直创建就好了。
LIKECAT
一条小咸鱼