Spring Boot项目传参校验最佳实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot项目传参校验最佳实践相关的知识,希望对你有一定的参考价值。

参考技术A

场景还原

简单业务场景模拟:

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

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

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

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

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

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

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

神注解加持!

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

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

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

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

数据异常统一拦截

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

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

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

可以的,非常优雅!

每天进步一点点!Peace!

以上是关于Spring Boot项目传参校验最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

最佳实践——在应用之间共享 Spring-boot Service 和 Repo 层代码

Spring Validation最佳实践及其实现原理,参数校验没那么简单!

markdown spring boot整合hbase最佳实践

Dubbo Spring Boot 最佳实践整合 Demo 征集