Guava Preconditions 参数校验
在某些情况下,对入参中的字段进行参数校验时,没有办法用到校验注解,如登录接口中验证码的判空。因为这个接口是个二合一接口,需要同时支持手机号验证码登录,以及账号密码登录。只能在业务层中,手动进行参数校验,如下图所示:
现在就校验一个字段,你会感觉代码还不是太难看。试想一下,当有多个字段需要校验时,就会有一堆的 if
判断,伪代码如下:
// 校验入参验证码是否为空
if (StringUtils.isBlank(verificationCode)) {
return Response.fail(ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode(), "验证码不能为空");
}
// 参数校验2
if (条件判断2) {
return Response.fail(ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode(), "xxx");
}
// 参数校验3
if (条件判断3) {
return Response.fail(ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode(), "xxx");
}
// 省略...
那么,有优化的方法吗? 看着很丑陋 ! 我们就将使用谷歌 Guava 库中的 Preconditions 工具类,搭配全局异常捕获,来将这块的代码重构一下。
导入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>
将之前的 if
验证码校验代码删除掉,改用 Preconditions
, 代码如下:
// 省略...
// 校验入参验证码是否为空
Preconditions.checkArgument(StringUtils.isNotBlank(verificationCode), "验证码不能为空");
// 省略...
搭配全局异常捕获
// 省略...
/**
* 捕获 guava 参数校验异常
* @return
*/
@ExceptionHandler({ IllegalArgumentException.class })
@ResponseBody
public Response<Object> handleIllegalArgumentException(HttpServletRequest request, IllegalArgumentException e) {
// 参数错误异常码
String errorCode = ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode();
// 错误信息
String errorMessage = e.getMessage();
log.warn("{} request error, errorCode: {}, errorMessage: {}", request.getRequestURI(), errorCode, errorMessage);
return Response.fail(errorCode, errorMessage);
}
// 省略...