从零搭建后端框架:优雅的参数校验Validator

在这里插入图片描述

前两天项目群里发生了关于参数校验的问题讨论,很多开发团队没有对这些做硬性规范时,还是有很多童鞋本着“不多事”的原则,产品文档里没有特别说明就不写。对于2B的产品经理来说,因为一次新迭代,可能回涉及到N多的页面,只会定一个通用的规范,特殊情况下会做特别说明。这其实也很考研程序员的开发习惯和技术能力,所以花少今天给大家分享下如何进行优雅的参数校验

可能有些后端开发会觉得前端做好校验就可以了,但是作为有经验的程序员来说你不要相信产品经理、不要相信测试、也不要相信前端,你能信的只有自己。参数校验是后端请求的第一道防线,不符合条件的请求,越在前面拦截掉,消耗的资源越少。
对参数进行校验,我们可能会出现如下类似代码:
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

@PostMapping("/add")
public ApiResult addUser(@RequestBody User user) {
    if (user == null) {
        return ApiResult.fail("对象不能为空");
    }
    if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {
        return ApiResult.fail("账号、密码或邮箱不能为空");
    }
    if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {
        return ApiResult.fail("账号长度必须是6-11个字符");
    }
    if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {
        return ApiResult.fail("密码长度必须是6-16个字符");
    }
    if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
        return ApiResult.fail("邮箱格式不正确");
    }
    // 新增用户操作
    return ApiResult.success();
}

}

但是这样总看起来像是初出茅庐的实习生写的,作为有逼格的程序员还是要表现的高大上一点,接下来Spring Validator闪亮登场
在这里插入图片描述

1、Validator + BindResult
首先在对象上通过注解的方式定义校验规则,并指定校验失败后的信息,如下:
@Getter
@Setter
public class User {

@NotNull(message = "用户id不能为空")
private Long id;

@NotNull(message = "用户账号不能为空")
@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
private String account;

@NotNull(message = "用户密码不能为空")
@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
private String password;

@NotNull(message = "用户邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;

}

这里花少用了Lombok插件通过注解方式自动生成Getter、Setter方法,还是挺省事的,如果想要了解Lombok的更多花絮可以看花少之前的文章有介绍,但是就像之前有位读者提到这个有个弊端就是需要下插件,如果是公司内部的大项目最好别用,否则别人也得下插件,万一被喷就尴尬了,但是自己的项目随便玩无所谓。
在这里插入图片描述

2、校验规则定义完后,在接口上添加@Vaild注解和BindResult参数即可完成校验,如下:
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

@PostMapping("/add")
public ApiResult addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
    // 参数校验失败,会将错误信息封装成在BindingResult
    for (ObjectError error : bindingResult.getAllErrors()) {
        return ApiResult.fail(error.getDefaultMessage());
    }
    // 新增用户操作
    return ApiResult.success();
}

}

3、当我们在访问接口时,未填写用户账户,则会返回如下结果:
{
“code”: 500,
“data”: null,
“message”: “用户账号不能为空”
}

虽然使用该方式已经是非常方便的进行参数校验方式了,但是当有多个接口需要进行参数验证时,就需要在每个接口中添加参数BindingResult,看到这么多冗余代码,作为有追求的程序员小哥肯定受不鸟,我们可以通过异常统一处理来解决这个问题。关于异常的统一处理今天就不过多介绍了,后面找时间专门写一篇供大家赏阅
在这里插入图片描述

花有重开日,人无再少年 → 我是花少【少宫主花无缺】#更新不断,下期继续#走过路过记得留下关注和点赞(公众号同名)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值