在我们的工作中,经常会有这样的逻辑,就是判断一个参数是否合法,不合法就抛出异常,再由全局异常捕获后返回。
本文使用我编写的springboot日记本系统作为蓝本,,在已有项目的基础上改,源码下载地址和教程在文末。
比如controller中有这样一个注册方法:
@RequestMapping("register")
public Result register(@RequestBody User user){
if(StrUtil.isEmpty(user.getUserName())){
throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名不允许为空!"));
}
if(StrUtil.isEmpty(user.getPassword())){
throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("密码不允许为空!"));
}
//检查用户名是否重复
if(userService.getByUserName(user.getUserName()) != null){
throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名"+user.getUserName()+"重复!"));
}
//拼装userBean
user.setUid(redisServiceImpl.getIncr("userId")); //redis自增ID
user.setPassword(SecureUtil.md5(user.getPassword() + salt));
user.setCreateTime(DateUtil.now());
user.setUpdateTime(DateUtil.now());
userService.save(user);
return Result.success();
}
重点就是这个:
if(StrUtil.isEmpty(user.getUserName())){
throw new BizException(ExceptionCodeEnum.ERROR_PARAM.setDesc("用户名不允许为空!"));
}
我们习惯先用if判断一个参数的合法性,如果不合法就抛出异常。
这样做自然没有问题,但是如果这样的判断很多,代码就会变得臃肿。
怎么简化呢?
我们可以从之前的逆向思维改为正向思维,就是所谓的断言。
比如这个逻辑是当检测到用户名为空,就抛出异常。那我们可以把这个逻辑改成:我要求这个用户名必须非空,否则就抛出异常。
让我们编写一个校验类和方法。
/**
* 通用校验工具类
*/
@Slf4j
public class VerifyBusinessUtil {
/**
* 断言
* @param judge
* @param error
*/
public static void checkArguments(boolean judge,String error){
if(!judge){
log.error("{}", error);
throw new BizException(ExceptionCodeEnum.ERROR_PARAM,error);
}
}
}
这段代码是一个通用校验工具类,其中包含了一个名为checkArguments的方法,该方法接收两个参数:一个boolean类型的判断条件judge和一个String类型的错误信息error。
在方法内部,首先使用Slf4j注解定义了一个log对象,用于记录错误信息。然后,如果judge为false,即判断条件不成立,就会抛出一个BizException异常,并将错误信息error和异常码ExceptionCodeEnum.ERROR_PARAM一起传入异常中。
该方法主要用于校验输入参数是否合法,如果不合法则会抛出异常并打印错误信息。
然后可以改写之前的if语句
@RequestMapping("register")
public Result register(@RequestBody User user){
VerifyBusinessUtil.checkArguments(!StrUtil.isEmpty(user.getUserName()),"用户名不允许为空!");
VerifyBusinessUtil.checkArguments(!StrUtil.isEmpty(user.getPassword()),"密码不允许为空!");
VerifyBusinessUtil.checkArguments(userService.getByUserName(user.getUserName()) == null,"用户名"+user.getUserName()+"重复!");
//拼装userBean
user.setUid(redisServiceImpl.getIncr("userId")); //redis自增ID
user.setPassword(SecureUtil.md5(user.getPassword() + salt));
user.setCreateTime(DateUtil.now());
user.setUpdateTime(DateUtil.now());
userService.save(user);
return Result.success();
}
是不是清爽了许多呢?
哈哈,这就是大部分企业里面都会封装的一个方法,很好用,也确实有它的道理。
如果你是第一次见到这种写法,那么就赶紧用起来吧!~
源码下载
这个案例我是在 springboot日记本系统 里面完成了,有需要源码的小伙伴直接clone这个项目即可。
https://gitee.com/skyblue0678/diary