SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)
一、实例操作
①、引入依赖
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.4.Final</version></dependency>
②、创建实体类
package com.springboot.entity;import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = -7362371894429216969L;@NotEmpty(message="用户名不能为空")@Length(min=6,max = 12,message="用户名长度必须位于6到12之间")private String userName;@NotEmpty(message="密码不能为空")@Length(min=6,message="密码长度不能小于6位")private String passWord;@Email(message="邮箱格式错误")private String email;@Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误")private String idCard;@Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$",message = "手机号格式错误")private String phone;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public User(@NotEmpty(message = "用户名不能为空") @Length(min = 6, max = 12, message = "用户名长度必须位于6到12之间") String userName, @NotEmpty(message = "密码不能为空") @Length(min = 6, message = "密码长度不能小于6位") String passWord, @Email(message = "请输入正确的邮箱") String email, @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误") String idCard, @Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$", message = "手机号格式错误") String phone) {this.userName = userName;this.passWord = passWord;this.email = email;this.idCard = idCard;this.phone = phone;}public User() {}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", passWord='" + passWord + '\'' +", email='" + email + '\'' +", idCard='" + idCard + '\'' +", phone='" + phone + '\'' +'}';}
}
③、建立控制层
package com.springboot.controller;import com.springboot.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import java.util.List;@RestController
public class TestController {@PostMapping("/test")public String testDemo(@Valid User user, BindingResult bindingResult){System.out.println(user.toString());StringBuffer stringBuffer = new StringBuffer();if(bindingResult.hasErrors()){List<ObjectError> list =bindingResult.getAllErrors();for (ObjectError objectError:list) {stringBuffer.append(objectError.getDefaultMessage());stringBuffer.append("---");}}return stringBuffer!= null ?stringBuffer.toString():"";}
}
④、进行测试
作为测试demo,到这里就可以直接测试了

二、注意事项
①、@NotNull ,@NotEmpty 和 @NotBlank 三者的区别
@NotNull、@NotEmpty 和 @NotBlank 都是用于Java中进行参数校验的注解,它们之间的区别如下:
-
@NotNull 注解用于限制参数不能为null。
-
@NotEmpty 注解用于限制字符串、集合、Map等不能为null且大小必须大于0。
-
@NotBlank 注解用于限制字符串不能为null并且去除两端空格后长度必须大于0。
可以简单理解为:
- @NotNull 是用来限制对象或元素不能为null;
- @NotEmpty 是用来限制字符串、集合、Map等不能为空;
- @NotBlank 是用来限制字符串不能为空且长度必须大于0。
需要注意的是,这三个注解都只能用于校验方法参数,不能用于校验类属性。同时,它们都属于Hibernate Validator提供的校验注解,如果要使用这些注解,需要引入Hibernate Validator的相关依赖。
②、引入依赖的版本
要看清楚,用那种方法,具体导入什么依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
三、自定义参数校验
这种情况主要是应对有一些特殊场景,没有相应的注解进行校验,当然,在service层中去写相应的逻辑也行,这里算是提供另一个思路和方法(说白了就是写一个自定义注解,在自定义注解中写上相应的要判断的逻辑)
①、项目结构

②、编写自定义注解
import com.example.demo.MyConstraint;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {//String为校验的类型@Overridepublic void initialize(MyConstraint myConstraint) {//启动时执行}/*** @Description: 自定义校验逻辑*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext validatorContext) {if (!(s.equals("北京") || s.equals("上海"))) {return false;}return true;}
}
import com.example.MyConstraintValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//用于指定使用范围,该处限定只能在字段上使用
@Target({ElementType.FIELD})
//表示注解在运行时可以通过反射获取到
@Retention(RetentionPolicy.RUNTIME)
//@Constraint注解,里面传入了一个validatedBy的字段,指定该注解校验逻辑
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {/*** @Description: 错误提示*/String message() default "请输入中国政治或者经济中心的城市名";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
③、对应的实体类
import com.example.demo.MyConstraint;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.io.Serializable;@Data
public class User implements Serializable {/*** 主键ID*/private Long id;@NotBlank(message = "用户名不能为空")@Length(min = 5, max = 20, message = "用户名长度为5-20个字符")private String name;@NotNull(message = "年龄不能为空")@Min(value = 18 ,message = "最小18岁")@Max(value = 60,message = "最大60岁")private Integer age;/* @NotBlank(message = "电话不可以为空")@Length(min = 1, max = 13, message = "电话长度需要在13个字符以内")private String phone;*/@Email(message = "请输入邮箱")@NotBlank(message = "邮箱不能为空")private String email;/* @NotNull(message = "必须指定用户状态")@Min(value = 0, message = "用户状态不合法")@Max(value = 1, message = "用户状态不合法")private Integer status;*/@MyConstraintprivate String answer;}
④、控制层
import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import javax.validation.Valid;@Controller
public class TestValidator {@GetMapping("/test")public String showForm(User user) {return "form";}@GetMapping("/results")public String results() {return "results";}@PostMapping("/test")public String checkUser(@Valid User user, BindingResult bindingResult, RedirectAttributes attr) {//特别注意实体中的属性必须都验证过了,不然不会成功if (bindingResult.hasErrors()) {return "form";}/*** @Description:* 1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为?name=long&age=45* 2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,* 这里的redirect必须是方法映射路径。你会发现redirect后的值只会出现一次,刷新后不会出现了,对于重复提交可以使用此来完成。*/attr.addFlashAttribute("user", user);return "redirect:/results";}
}
相关文章:
SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)
一、实例操作 ①、引入依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.4.Final</version></dependency> ②、创建实体类 package com.springboot.entity;im…...
字节测开岗面试记:二面被血虐,幸好还是拿到了Offer.....
在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…...
只会标准答案,是不可救药的愚蠢
听说今天高考,谨以此文作为高考寄语。 前段时间网上看到一个金句,非常值得分享,“最难沟通的,不是那些头脑空空的人,而是满脑子只有标准答案的人”。 前两天直播我放了一首何勇的老歌,当时年轻的时候&#…...
RocketMQ broker启动失败
版本:4.9.3 现象:NameServer启动没问题,Broker无法启动。 查看日志,没有broker方面的报错,应该是整个服务都没起来。 于是开始网上搜索解决方案: 方案1: 删除store文件夹。 删除之后问题依…...
浅谈useMemo函数
什么是 useMemo? useMemo 是 React 中的一个 Hook,它可以用来缓存计算结果,并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数:一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时,useMemo 会重…...
【Python】Python系列教程-- Python3 推导式(十九)
文章目录 前言列表推导式字典推导式集合推导式元组推导式(生成器表达式) 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列教程–Python3 VSc…...
docker对cpu资源做限制
系列文章目录 文章目录 系列文章目录一、cgroup1.groups四大功能2.CPU 资源控制 二、1.限制可用的 swap 大小, --memory-swap2.对磁盘IO配额控制(blkio)的限制 总结 一、cgroup 1.groups四大功能 资源限制:可以对任务使用的资源…...
国际化语言项目
基本概念 1、使用QString对象表示所有用户可见的文本。由于QString内部使用Unicode编码实现,所以它可以用 于表示所有需要向用户呈现的文本。当然,对于仅程序员可见的文本并不需要都变为QString对象,可利 用Qt提供的QCString或原始的“char …...
交直流系统潮流计算及相互关联特性分析(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
如何快速掌握Facebook运营+独立站运营基础?
在当今数字化时代,Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道,你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识,为你的业务…...
Java之旅(十三)
Java 类 Java类是Java编程语言中的基本构建块,是一种用户定义的数据类型,它可以被看作是一个模板或蓝图。它是对象的模板,,描述了一组具有相同特征(属性)和行为(方法)的对象。Java …...
Calibre 6.18.1 正式发布,功能强大的开源电子书工具
导读Calibre 开源项目是 Calibre 官方出的电子书管理工具。它可以查看,转换,编辑和分类所有主流格式的电子书。Calibre 是个跨平台软件,可以在 Linux、Windows 和 macOS 上运行。 Calibre 6.18.1 正式发布,此次更新内容如下&#…...
如何在C语言中定义和使用函数?
如何在C语言中定义和使用函数? 引言: 函数是C语言中的一个重要概念,它使程序能够模块化、重用和组织代码。通过将一段逻辑相关的代码封装到函数中,我们可以提高代码的可读性、可维护性和重用性。本文将详细介绍在C语言中定义和使…...
【C++】4.多媒体库:SFML库入门
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍SFML库使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#…...
【算法题】1717. 删除子字符串的最大得分
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面…...
Codeforces Round 877 (Div. 2) ABCD
A. Blackboard List solve: 1、生成的数一定不是负数,所以有负数的情况下,负数一定是原来的数。 2、没有负数的情况下,最大的数一定是原来的数,因为操作只能使数变小。 void solve() {cin>>n;for(int i0;i<n;i)cin>&…...
easyExcel导入失败提示用户第几行有误并回滚数据
思路: 在controller定义一个map,将map传入excel监听器,在监听器中处理excel的数据,读取到某一行出现错误就将错误提示信息存入map并抛出一个异常给service。在service方法上开启事务,并将异常出实现数据回滚࿰…...
问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕
随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地,区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代,区块链已不仅仅是一项技术、一种工具,更是一种思维…...
解读 Nginx 配置
tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 推荐:体系化学习Java(Java面试专题) 文章目录 1、Nginx 配…...
知识变现海哥:课程定价容易出现的三大误区
哈喽,大家好,我是海哥,知识付费变现创业教练,教育公司培训总监,从事知识付费变现咨询10年,已助力3000人实现知识付费变现。 很多做知识付费的老师都有定价方面的困惑。怕定太高,卖不出去&#…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
