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,一经查实,立即删除!

相关文章

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

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

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…

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

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

微信流媒体直播java_微信小程序直播带货教程

微信小程序直播带货教程微信小程序正式推出直播带货组件&#xff0c;很多正在使用 “api工厂” 的用户&#xff0c;这几天一直在问&#xff0c;现有小程序如何使用直播带货的功能&#xff0c;需要不需要做很复杂的改动&#xff1f;是否需要重新开发小程序&#xff1f;使用门槛高…

vue和java实现页面增删改_SpringBoot-Vue实现增删改查及分页小DEMO

前言主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo&#xff0c;实现增删改查、分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程。开发栈前端开发工具&#xff1a;WebStorm开发框架&#xff1a;vue axios包管理工具: npm打包工具&#xff1…

读取24位ad的值_实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

摘要&#xff1a;一文带你用小熊派开发板动手做土壤湿度传感器。一、实验准备1.实验环境一块stm32开发板&#xff08;推荐使用小熊派&#xff09;&#xff0c;以及数据线已经安装STM32CubeMX已经安装KeilMDK,并导入stm32开发板对应的芯片包&#xff08;小熊派使用的是STM32L431…

mac 爱普生打印机驱动_高效打印企业首选 爱普生M2178黑白多功能一体机评测

提到打印机相信每一个公司都配备了一台&#xff0c;因为它是日常办公中不可缺少。尽管现在很多的工作流程都已经可以在线上执行&#xff0c;且提倡无纸化办公&#xff0c;但很多重要的材料还是需要打印出来存档、签字。因此打印机还是一个非常必要的配置。对于一个企业来讲&…

php ajax 加载列表,Ajax点击不断加载数据列表(图文教程)

这篇文章主要介绍了Ajax点击不断加载数据列表的相关资料,需要的朋友可以参考下Ajax简介AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)&#xff0c;是指一种创建交互式网页应用的网页开发技术。AJAX 异步 JavaScript和XML(标准通用标记语言的子集)。AJAX 是…

linux版_微软爱 Linux:安全杀毒软件 Defender ATP 要出 Linux 版了! | Linux 中国

微软宣布将于 2020 年将其企业安全产品 Defender 高级威胁防护(ATP)引入 Linux。-- Abhishek Prakash微软的年度开发者大会 Microsoft Ignite 刚刚结束&#xff0c;会上发布了一些与 Linux 有关的重要公告。你可能已经知道微软将 Edge Web 浏览器引入 Linux&#xff0c;而下一个…

msp430中如何连续对位进行取反_四元数数控:如何保养视觉对位平台?

视觉对位平台由于人工衍生出来的各种问题应运而生,诸如高度要求的良率,生产速度的大幅提升,人员无法达成的精准度等等,对于未来这种高度自动化程度的产业更是不可或缺的产品。视觉对位平台就是一种利用XY向的移动单元加上θ角的微量转向,达到两个工作物体的组合。而且对位平台是…

ic启动器怎么导入模组_5G手机主板专题报告:高阶产能紧俏,5G手机主板升级蛋糕怎么分...

(获取报告请登陆未来智库www.vzkoo.com)一、智能机进入 5G 时代&#xff0c;主板方案望迎阶数跃迁5G 手机主板需求升级或将带来行业高端产能供给偏紧&#xff0c;A 股高端 HDI 供应商望受益。 当前时点手机各个维度的创新升级都对主板技术路线产生影响&#xff0c;芯片 I/O 数增…

element tree不刷新视图_Vue项目布署后,刷新页面404的真正原因找到了

从一篇日记说起我是一个小前端&#xff0c;我有写日记的习惯2020年10月17 天气 晴今天天气不错&#xff0c;心情也跟着好起来了辛辛苦苦加班两个星期终于完成了产品需求&#xff0c;到了要上线的时候了&#xff0c;嘴里也不知不觉哼起了“劳资今晚不加班”的小曲一顿操作猛如虎…

编程加速服务器_FPGA加速驱动新时代的数据洪流,下篇

目 录人工智能计算加速器产品系列的相关布局FPGA开发的痛点与潜在方案结语在《FPGA加速驱动新时代的数据洪流&#xff0c;上篇》中&#xff0c;老石介绍了英特尔应对大数据时代的整体战略布局&#xff0c;特别是基于FPGA的各类智能网卡和网络解决方案。在本篇中&#xff0c;老石…

respond with a status of 40_高中英语作文高分秘籍!50组高级替换词+40个高级句型+88个高级词组,还不快记下!...

很多同学都发现&#xff0c;高中阶段对于写作的考查要求更高&#xff0c;一篇没有错误但平淡无奇的文章是拿不到高分的&#xff0c;保证正确性的前提下&#xff0c;写作必须要有出彩之处才能得到阅卷老师的青睐&#xff0c;今天就为大家分享高中写作50组高级替换词40个高级句型…

iphone分屏功能怎么用_iPhone上10个隐藏小技巧,怎么用怎么爽

离上一期iPhone技巧已经过了四个多月时间了&#xff0c;不少朋友在后台一直催小雷赶紧出下一期。为了不让你等太久&#xff0c;所以今天小雷就奉上新的一期(也是防止你们等得不耐烦了以至于想捶我)。这期干货实在太多&#xff0c;如果其中有一些你们之前get过的话&#xff0c;就…

太阳能板如何串联_太阳能光伏系统单晶和多晶模组的差异?农村家庭自用如何科学选择...

太阳能光伏想必大家都耳熟能详&#xff0c;因其环保且属于可再生能源&#xff0c;目前在农村很多居民屋顶都已经铺设了光伏发电系统&#xff0c;即节省了电费开支又能并入国家电网&#xff0c;所以近些年来我国的光伏产业得到了很好的发展&#xff0c;是目前发展最快的清洁能源…

数据查询和业务流分开_TiDB HTAP 助力小红书业务升级

作者介绍&#xff1a;张亿皓&#xff0c;小红书基础技术部资深开发工程师&#xff0c;负责数据库相关的研发和落地工作。TiDB 在小红书业务场景的应用简介2017 年&#xff0c;小红书已经开始在生产业务中使用 TiDB &#xff0c;真正成体系的去做 TiDB 的落地是在 2018 年&#…

php server自定义函数,php:SQL Server用户自定义的函数种类详解

关于SQL Server用户自定义的函数&#xff0c;有标量函数、表值函数(内联表值函数、多语句表值函数)两种。题外话&#xff0c;可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里&#xff0c;这里简单提示一下&#xff0c;在Microsoft SQL Server Managerment Studio…