postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator

64572d1dda76634ed60203c251b0a626.png

2718c0d80507bfba36fe2d2bb31078f8.png

前两天项目群里发生了关于参数校验的问题讨论,很多开发团队没有对这些做硬性规范时,还是有很多童鞋本着“不多事”的原则,产品文档里没有特别说明就不写。对于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闪亮登场

eed486ae3fd5127828406328a7230c53.png

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的更多花絮可以看花少之前的文章有介绍,但是就像之前有位读者提到这个有个弊端就是需要下插件,如果是公司内部的大项目最好别用,否则别人也得下插件,万一被喷就尴尬了,但是自己的项目随便玩无所谓。

05a47c990ba19797c648c7c1adc2758b.png

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,看到这么多冗余代码,作为有追求的程序员小哥肯定受不鸟,我们可以通过异常统一处理来解决这个问题。关于异常的统一处理今天就不过多介绍了,后面找时间专门写一篇供大家赏阅

6de480edc0e5877654869b181742ee29.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java竖线分割_Java String类的Split以竖线作为分隔符

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请写明出处。https://blog.csdn.net/wo541075754/article/details/50668160问题Java中String类的Split方法&#xff0c;当用“|”进行分割时&#xff0c;发现并不能达到预期的效果。比如&#xff1a;分割字符串“ABC|DE…

ups计算软件_浅析UPS与蓄电池与逆变器的区别

早期的电信机房中&#xff0c;通常采用将220V交流电源经过整流&#xff0c;为48V电池组充电&#xff0c;由电池组直接给程控交换机供电。随着计算机网络和通信网络在电信机房的应用&#xff0c;需要为其提供高质量的220V的交流电源。由于有现有的48V电池组&#xff0c;所以通常…

java字符转为数字_Java 判断字符串能否转化为数字的三种方法

linux shell 常用指令1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrlc退出,在linux下可以使用ctrlc终止当前程序运行. 2. ls 查看目 ...在uwp中复活常用的vb库函数这个博文是纯原创的,转载一定要说明作者是 Nukepayload2!! 在.…

python调用gpu进行运算_tensorflow指定CPU与GPU运算的方法实现

1.指定GPU运算如果安装的是GPU版本&#xff0c;在运行的过程中TensorFlow能够自动检测。如果检测到GPU&#xff0c;TensorFlow会尽可能的利用找到的第一个GPU来执行操作。如果机器上有超过一个可用的GPU&#xff0c;除了第一个之外的其他的GPU默认是不参与计算的。为了让Tensor…

java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...

你说的这部分都属于游戏内部机制问题首先网易手机版实质上就是基岩版&#xff0c;还是更新贼慢的基岩版(笑)。所以题主完全可以去minecraft wiki查找相关资料然后我说一下我知道的一些主要差异吧刷怪效率吧基岩版明显不如java版&#xff0c;所以通用的黑暗刷怪塔在基岩版是不怎…

python jieba词频统计英文文本_python实战,中文自然语言处理,应用jieba库来统计文本词频...

模块介绍安装&#xff1a;pip install jieba 即可jieba库&#xff0c;主要用于中文文本内容的分词&#xff0c;它有3种分词方法&#xff1a;1. 精确模式, 试图将句子最精确地切开&#xff0c;适合文本分析&#xff1a;2. 全模式&#xff0c;把句子中所有的可以成词的词语都扫描…

java修改已创建程序界面_Java应用程序的Web用户界面

应用服务器。您认为Tomcat在运行时占用空间、学习量或…?我倾向于选择与一个IDE有良好集成的东西。所以EclipseTomcat或者ApacheGeronimo,可能在里面WebSphere Community Edition伪装可以完成这项工作。从我所看到的情况来看,这些足以满足您的需求,而且学习曲线实际上是可以管…

python+selenium获取cookie session_selenium获取cookie及设置cookie

获取cookie&#xff1a;在打开的页面使用self.driver.get_cookies()返回下面数据&#xff1a;[{domain: .linkedin.com,expiry: 1553,httpOnly: False,name: liap,path: /,secure: False,value: true},{domain: .linkedin.com,expiry: 154613,httpOnly: False,name: lidc,path:…

js url解码gbk_JS中对URL进行转码与解码

1. escape 和 unescapeescape()不能直接用于URL编码&#xff0c;它的真正作用是返回一个字符的Unicode编码值。采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在…

python常用模块用法_python常用模块(一)

#什么是模块呢&#xff1f;就是用一大坨代码来完成一个功能的代码集合&#xff0c;是不是简单易懂#类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能…

java jdbc init_Java 的JDBC 数据库连接池实现方法

虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池&#xff0c;不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时&#xff0c;我们可用的JDBC 数据库连接池并不多&#xff0c;并且一般性能都不好。 Java 程序员都很羡慕 Windows ADO &…

python db文件_python中查看.db文件中表格的名字及表格中的字段操作

1.问题描述&#xff1a; 我桌面上有一个“账号密码.db”文件&#xff0c;我现在想知道里面有几张表格table、表格的名字、表头结构。2.使用SQL语句"""select name from sqlite_master where typetable order by name"""&#xff0c;查找表格的名…

django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用

标题问题一.python发布成服务1.先建立一个深度学习模型并训练好2.建立一个预测方法去调用训练好的模型3.建立一个Django工程4.将python利用模型预测的代码放入Django项目中5.get请求加上参数6.github二.JAVA请求url&#xff0c;返回json数据问题python作为一个含科学计算与深度…

springboot转发http请求_网易后端实习生分享:Springboot异常和错误处理规范

由于错误在所难免&#xff0c;异常处理已经成为开发工作中不可或缺的部分。在web开发中&#xff0c;我们通常不希望用户看到一个写满StackTrace的错误页面&#xff1b;同时&#xff0c;我们希望出现错误或发生异常时&#xff0c;开发运维人员可以看到详细的错误信息&#xff0c…

java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

偏向锁当锁对象第一次被线程获取时&#xff0c;虚拟机会把对象头的锁状态标志设置为01(即偏向状态)&#xff0c;同时&#xff0c;使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功&#xff0c;那么&#xff0c;以后持有这个偏向锁的线程在进…

springmvc 拦截器_Spring MVC拦截器学习

1 介绍Spring Web MVC是基于Servlet API构建的原始Web框架。2 拦截器2.1 定义springmvc框架的一种拦截机制2.2 使用2.2.1 两步走实现HandlerInterceptor接口注册&#xff08;xml或者注解 &#xff09;2.2.2 HandlerInterceptor接口实现HandlerInterceptor接口import org.spring…

python如何生成列表和元组数据_Python数据类型(列表和元组)

1.3 List(列表)列表由一系列按特定顺序排列的元素组成。在Python中&#xff0c;用方括号[ ]来表示列表&#xff0c;并用逗号来分隔其中的元素。1.3.1 访问列表元素在Python中&#xff0c;第一个列表元素的索引为0&#xff0c;而不是1。>>> bicycles [trek, cannondal…

mysql socket 与IP区别_MySQL本地用IP登陆而非socket

##想当然的指定hostname和端口。。。。失败[rootmysql01 ~]# /opt/mysql/bin/mysql -uroot -h localhost -P 3307 -pEnter password:ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)##正确方法&#xff0c;指定通信协议 --protoco…

python画矩形函数drawrectangle_Python3 tkinter基础 Canvas create_rectangle 画矩形

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-9-30Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""from tkinter import *def main(…

java文件读入原理_描述一下JVM加载class文件的原理机制

1、JVM 简介JVM 是我们Javaer 的最基本功底了&#xff0c;刚开始学Java 的时候&#xff0c;一般都是从“Hello World ”开始的&#xff0c;然后会写个复杂点class &#xff0c;然后再找一些开源框架&#xff0c;比如Spring &#xff0c;Hibernate 等等&#xff0c;再然后就开发…