瞎琢磨先生教你优雅的进行参数合法性校验
目录
- 项目整体结构
- 1 pom.xml
- 2 请求实体类(参数校验★★★★★,核心代码)
- 3 测试接口
- 4 设置校验模式
- 5 设置全局参数校验异常捕获
- Postman 请求测试
项目整体结构
1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
2 请求实体类(参数校验★★★★★,核心代码)
UserRequest.java
package com.example.demo.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.*;
import javax.validation.groups.Default;/*** @Date: 2021/5/7 20:35* @Description:* @Author: 瞎琢磨先生*/@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserRequest {// 新增的校验(默认,以下的校验如未添加 groups 则为 insertCheck)public static interface insertCheck extends Default {}// 更新的校验public static interface updateCheck {}// 登录的校验public static interface loginCheck {}/*** 新增、登录的时候,username 不能为空*/@NotBlank(groups = {insertCheck.class, loginCheck.class}, message = "username 不能为空(必填项)")@NotEmpty(groups = {insertCheck.class, loginCheck.class}, message = "username 不能为空(必填项)")private String username;/*** 新增、更新、登录的时候,pwd 不能为空*/@Length(groups = {insertCheck.class, updateCheck.class, loginCheck.class}, min = 6, max = 16, message = "密码必须 6-16 位")@NotBlank(groups = {insertCheck.class, updateCheck.class, loginCheck.class}, message = "password 不能为空(必填项)")@NotEmpty(groups = {insertCheck.class, updateCheck.class, loginCheck.class}, message = "password 不能为空(必填项)")private String password;@Min(groups = {insertCheck.class, updateCheck.class}, value = 0, message = "age 不能小于 0")@Max(groups = {insertCheck.class, updateCheck.class}, value = 8000, message = "age 不能大于 8000 岁")private Integer age;@Email(groups = {insertCheck.class, updateCheck.class}, message = "email 格式有误")private String email;@Pattern(groups = {insertCheck.class, updateCheck.class}, regexp = "(^Man$|^Woman$|^UGM$)", message = "sex 值不在可选范围")// sex 必须从 *Man* *Woman* *UGM* 中选择。其中:* 表示 0 ~ 任意多个字符。private String sex;@Length(groups = {insertCheck.class, updateCheck.class}, min = 11, max = 11, message = "手机号码只能 11 位")private String phone;}
3 测试接口
UserController.java
package com.example.demo.controller;import com.example.demo.entity.UserRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;/*** @Author: 瞎琢磨先生* @Date: 2021/5/7 20:33* @Description:*/
@Slf4j
@RestController
public class UserController {@PostMapping(value = "/insert", produces = {"application/json;charset=UTF-8"})public ResponseEntity insert(@RequestBody @Validated UserRequest userRequest) {log.info("新增的 userRequest:[{}]", userRequest);return ResponseEntity.ok().body(userRequest);}@PostMapping(value = "/update", produces = {"application/json;charset=UTF-8"})public ResponseEntity update(@RequestBody @Validated(UserRequest.updateCheck.class) UserRequest userRequest) {log.info("更新的 userRequest:[{}]", userRequest);return ResponseEntity.ok().body(userRequest);}@PostMapping(value = "/login", produces = {"application/json;charset=UTF-8"})public ResponseEntity login(@RequestBody @Validated(UserRequest.loginCheck.class) UserRequest userRequest) {log.info("登录的 userRequest:[{}]", userRequest);return ResponseEntity.ok().body(userRequest);}}
4 设置校验模式
ValidConfig.java
package com.example.demo.config;import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;/*** @Date: 2021/5/7 22:18* @Description:设置校验模式(遇到参数校验不通过则立即速返回,不需要校验完所有的参数之后再返回)* @Author: 瞎琢磨先生*/
// https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast@Configuration
public class ValidConfig {@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure().failFast(true) // 报错则快速返回,不需要校验完所有的参数之后再返回.buildValidatorFactory();Validator validator = validatorFactory.getValidator();return validator;}
}
5 设置全局参数校验异常捕获
GlobalExceptionInterceptor.java
package com.example.demo.advice;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionInterceptor {@ExceptionHandler(value = Exception.class)public String exceptionHandler(HttpServletRequest request, Exception e) {String failMsg = null;if (e instanceof MethodArgumentNotValidException) {// 拿到参数校验具体异常信息提示failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();}log.info("参数校验失败");return failMsg; // 直接吐回给前端}
}
Postman 请求测试
localhost:8080/insert
localhost:8080/update
localhost:8080/login
{"username": "zs","password": "123456","age": 996,"email": "12345656789@qq.com","sex": "Man","phone": "12345678901"}
瞎琢磨先生教你优雅的进行参数合法性校验相关推荐
- java连连看怎么添加消除音效_脏话屏蔽音效Bi怎么添加制作?教你优雅的快速消音...
原标题:脏话屏蔽音效Bi怎么添加制作?教你优雅的快速消音 在电视剧和综艺里,当演员说了一些不该说的话,例如脏话时候,会出现Bi-的一声,对演员说的原话进行消音处理,加以屏蔽. 在我们日常的视频制作中, ...
- 还在手忙脚乱的找门卡吗?简单几步,用NFCtool教你优雅的开门
还在手忙脚乱的找门卡吗?手把手教你优雅的开门 现在NFC卡用的越来越多了,门禁卡.考勤卡.会员卡.停车卡.电梯卡,随着指纹锁的普及,钥匙都不再经常携带了,但是卡片是越来越多而且不能很方便的携带,此教程 ...
- SpringBoot - 优雅的实现【业务校验】高级进阶
文章目录 Pre 需求 实现三部曲 实体类 Step1 搞两个自定义注解 Step2 搞自定义校验器 Step3 搞验证 小结 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...
- SpringBoot - 优雅的实现【参数分组校验】高级进阶
文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...
- 使用 Spring Validation 优雅地进行参数校验
引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...
- 显示器怎么看服务器内容,电脑显示器知识扫盲 教你怎么看显示器参数
显示器的选购是一门不大不小的学问.说它大,是因为对于一些专业人士或者高端游戏玩家来讲,显示器的各项参数失之毫厘差之千里:说它小,是因为随随便便一台显示器就完全可以满足绝大部分普通用户的一般需求了. 电 ...
- 计算机看游戏显卡,电脑怎么看显卡参数_小编教你查看电脑显卡参数的方法-系统城...
电脑是由众多配件而组成的,而配件的好坏直接影响整体性能,而显卡是电脑重要的配置,缺一不可.既然显卡这么重要,那么如何查看自己电脑的显卡参数呢?方法很简单,这里小编教你查看电脑显卡参数的方法. 电脑显卡 ...
- 如何用手机打开dcm格式图片_如何防止自己的图片被盗用?这 4 招教你优雅加水印...
出门旅游一趟,好不容易拍到一组相当满意的图片.想要把这些图片上传到社交平台,如何才能让大家一看就知道这是自己拍的作品,同时又防止盗图呢? 答案是在图片上加上自己的水印,这次有用功将和大家分享下,如何快 ...
- IBM将自愿离职变常态 柳传志教你优雅回应裁员
IBM又要裁员了! 自从今年4月份宣布裁员的消息以来,一直都有人在离开IBM.只不过这次是在荷兰,并且采用自愿离职计划来裁减员工. 这并非IBM第一次使用自愿离职计划,只不过和过去相比,这次IBM需要 ...
- 教你优雅地认识STL vector
本标题有严重的标题党倾向! 文章目录 vector是什么? vector中的常见操作有什么? 初始化vector对象 添加元素 尾部添加 随意添加 访问元素 访问范围内任意值 访问首尾 起始地址和终止 ...
最新文章
- 长庆石油学校计算机97,我在浙江大学学习计算机技术 ----我在长庆油田会战的12年(十一)...
- nodeType 节点简介
- JavaScript-回调函数
- linux文件管理和 对bash的理解
- java技术系列(一) Enum
- linux connect 阻塞超时时间,在linux下玩转带有超时时间的connect函数
- Linux给GCC编译的应用程序创建服务
- dram和nand哪个难生产_仅300名员工,年产7台,订单排到5年后,比光刻机还难买...
- 【Alpha阶段】第七次scrum meeting
- 2009年IT就业“危”中寻“机”
- Android开发笔记(十八)书籍翻页动画PageAnimation
- Linux 命令(80)—— chown 命令
- 腾讯云短信 Node.js SDK
- API接口之webservice接口
- 2016TI杯——寻迹小车
- 常用求导公式 高阶导公式 莱布尼兹公式
- MySQL with 写法
- 任正非:向谷歌军团学习,扑上去,杀出一条血路
- 爬取实习僧工作岗位信息
- Oracle全局搜索
热门文章
- 基于信息熵的新词发现算法
- 年轻人先实现社会价值,再去实现人生价值
- Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包
- java 定义类私有类_关于java:为什么不能将一个类定义为protected?
- 计算机安装win10系统还原,预装win10的ThinkPad笔记本电脑一键恢复出厂系统步骤
- iOS 日本日历、佛教日历取date的问题及公历转换,时间戳获取不准确
- Question Answering over Freebase via Attentive RNN with Similarity Matrix based论文解读
- gcc编译优化-O0 -O1 -O2 -O3 -OS解析
- 月薪3千与3万文案的区别!一字千金就体现在细微之处
- win102004优化_MSDN我告诉你:如何深度优化Win10 2004?