转载

啥?听说你还在手写复杂的参数校验?

啥?听说你还在手写复杂的参数校验?

 场景还原  

简单业务场景模拟:

假如你现在在做一个成绩录入系统,你愉快地用 Spring Boot框架 写了一个后台接口,用于接收前台浏览器传过来的 Student 对象,并插入后台数据库。

我们将传入的 Student 对象定义为:

然后写一个 Post请求 的后台接口,来接收网页端传过来的 Student 对象:

此时我想你一定看出来了上面这段 代码的漏洞 ,因为我们并没有对传入的 Student 对象做任何 数据校验 ,比如:

Student 对象里三个字段的某一个忘传了,为 null 怎么办? Studentscore 分数,假如写错了,写成 101 分怎么办? Studentmobile 11位手机号码,假如填错了,多写了一位怎么办?...等等

这些数据虽然在前端页面一般会做校验,但我们作为一个 严谨且良心 的后端开发工程师,我们肯定要对传入的每一项数据做 严格的校验 ,所以我们应该怎么写?

写是写完了,就是感觉 手有点酸 ,并且 心有点累 ,这个 Student 对象倒还好,毕竟内部仅3个字段,假如一个复杂的对象有30个字段怎么办?简直不敢想象!

啥?听说你还在手写复杂的参数校验?

 神注解加持!  

其实Spring框架很早版本开始,就通过 注解的方式 ,来方便地为我们提供了各项交互 数据的校验 工作,比如上面的例子,我们只需要在传入的 Student 实体类的字段中加入对应注解即可方便的解决问题:

当然,于此同时,我们还需要在对象入口处,加上注解 @Valid 来开启对传入 Student 对象的验证工作:

这时候,如果某个字段传入错误,比如我传数据的时候,将学生的成绩误传为 101 分,则接口返回结果便会提示出错误详情:

啥?听说你还在手写复杂的参数校验?

啥?听说你还在手写复杂的参数校验?

当然,关于这个事情的原理,既然用到了注解,无非用的也就是Java里的各种反射等知识来实现的,感兴趣的小伙伴可以借此机会研究一下!

 数据异常统一拦截  

上面利用注解的方式做统一数据校验 感觉十分美好 ,但唯一美中不足的就是返回的 结果太过繁杂 ,不一定使我们需要的格式,我们需要做 统一处理 ,比如:我只想将具体参数校验的错误提示信息给 抠出来 返回给前端即可。

啥?听说你还在手写复杂的参数校验?

为此,我们为项目配置 全局统一异常拦截器 来格式化所有数据校验的返回结果。

如上面代码所示,我们 全局统一拦截了 参数校验异常 MethodArgumentNotValidException ,并仅仅只拿到对应异常的详细 Message 信息吐给前端,此时返回给前端的数据就清楚得多:

啥?听说你还在手写复杂的参数校验?

可以的,非常优雅!

每天进步一点点!Peace!

2019.12.25晚,圣诞节快乐!

给个[ 在看 ],是对程序羊最大的支持

原文  http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247484955&idx=1&sn=29b0f228415abd8542d07c898e6398ba
正文到此结束
Loading...