SpringBoot集成Validation参数校验的方法是什么
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇"SpringBoot集成Validation参数校验的方法是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有
千家信息网最后更新 2024年11月28日SpringBoot集成Validation参数校验的方法是什么
这篇"SpringBoot集成Validation参数校验的方法是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"SpringBoot集成Validation参数校验的方法是什么"文章吧。
1、依赖
SpringBoot在web启动器中已经包含validator包
org.springframework.boot spring-boot-starter-web
非SpringBoot项目,需要自定引入依赖
org.hibernate.validator hibernate-validator 6.1.5.Final org.glassfish jakarta.el 3.0.3
2、常用约束说明
package com.smile.project.validator.utils; public class 常用约束说明 { /** * @Null:元素为null * @NotNull:元素不为null * @AssertTrue:元素为true * @AssertFalse:元素为false * @Min(value):数字的值大于等于指定的最小值 * @Max(value):数字的值小于等于指定的最大值 * @DecimalMin(value):大数值大于等于指定的最小值 * @DecimalMax(value):大数值小于等于指定的最大值 * @Size(max=,min=):元素的大小在指定的范围内 * @Digits(integer,fraction):元素是一个数字,其值必须在可接受的范围内 * @Past:一个过去的日期 * @Future:一个将来的日期 * @Pattern(regex=,flag=):指定的正则表达式 * @URL:必须是一个URL * @Email:必须是email格式 * @NotBlank:字符串不能为空 * @NotEmpty:集合不能为空 * @Length:长度必须在指定范围内 * @Valid:对实体类进行校验 */ }
3、实体约束示例
import com.smile.project.validator.utils.Gender;import lombok.Data;import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size; @Datapublic class SysUser { private Long id; @NotNull(message = "用户名不能为空") @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间") private String username; @NotNull(message = "昵称不能为空") private String name; @NotNull(message = "密码不能为空") private String password; @Email(message = "邮箱格式不合法") private String email; private String gender; }
4、控制层示例
需要在class加上@Validated注解
如果参数时实体,需要加上@Valid注解
import com.smile.project.validator.entity.SysUser;import org.springframework.http.ResponseEntity;import org.springframework.validation.annotation.Validated;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;import javax.validation.constraints.NotNull; @RestController@Validatedpublic class SysUserController { /** * 方法参数为实体校验 */ @PostMapping("/register") public ResponseEntity register(@Valid SysUser sysUser){ return ResponseEntity.ok(sysUser); } /** * 方法参数校验 */ @GetMapping("user") public ResponseEntity getUser(@NotNull(message = "用户名不能为空") String username){ SysUser sysUser = new SysUser(); sysUser.setName("smile"); return ResponseEntity.ok(sysUser); } }
5、异常捕获
全局异常捕获,当出现参数校验不合法时捕获异常,并且返回给前端
import org.springframework.http.ResponseEntity;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;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.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import java.util.HashMap;import java.util.List;import java.util.Set; /** * 全局异常捕获 * 当出翔参数校验不合法时捕获异常,并且返回给前端 */@ControllerAdvicepublic class GlobHandler { /** * 捕获方法参数校验异常 */ @ExceptionHandler(ConstraintViolationException.class) @ResponseBody public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e){ Set> message = e.getConstraintViolations(); HashMap map = new HashMap<>(); message.stream().forEach(msg ->{ String path = msg.getPropertyPath().toString(); String field = path.substring(path.indexOf(".")+1); map.put(field,msg.getMessageTemplate()); }); return ResponseEntity.ok(map); } /** * 捕获实体参数校验异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResponseEntity resolveMethodArgumentNotValidException(MethodArgumentNotValidException e){ List allErrors = e.getBindingResult().getAllErrors(); HashMap map = new HashMap<>(); allErrors.stream().forEach(error -> { FieldError fieldError = (FieldError) error; map.put(fieldError.getField(),fieldError.getDefaultMessage()); }); return ResponseEntity.ok(map); } }
6、自定义校验规则
特殊的字段需要自定义规则,比如身份证号码,邮箱,电话等
6.1、定义校验注解
import com.smile.project.validator.utils.GenderValidator;import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.*;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * 定义校验注解 */@Target({METHOD,FIELD})@Retention(RUNTIME)@Constraint(validatedBy = GenderValidator.class)@Documentedpublic @interface Gender { String message() default "性别为男或者女"; Class>[] groups() default {}; Class extends Payload[]>[] payload() default {}; }
6.2、GenderValidator实现ConstraintValidator接口并提供校验规则
import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext; /** * 实现ConstraintValidator接口并提供校验规则 */public class GenderValidator implements ConstraintValidator{ //初始化校验值 @Override public void initialize(Gender constraintAnnotation) { } //检验规则 @Override public boolean isValid(String value, ConstraintValidatorContext content) { return "男".equals(value) || "女".equals(value); }}
6.3、在成员变量中使用注解
import com.smile.project.validator.utils.Gender;import lombok.Data;import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size; @Datapublic class SysUser { private Long id; @NotNull(message = "用户名不能为空") @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间") private String username; @NotNull(message = "昵称不能为空") private String name; @NotNull(message = "密码不能为空") private String password; @Email(message = "邮箱格式不合法") private String email; @Gender() private String gender; }
7、分组校验
默认情况下,不指定分组都属于默认组;使用分组校验有利于分层校验开发
7.1、新建两个接口,一个用于查询,一个用于添加
public interface ADD extends Default { } public interface Select extends Default { }
7.2、修改尸体校验规则,如果不指定分组默认时Default组;
import com.smile.project.validator.utils.Gender;import lombok.Data;import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size; @Datapublic class SysUser { private Long id; @NotNull(message = "用户名不能为空",groups = ADD.class) @Size(min = 3,max = 5,message = "用户名长度为{min}-{max}之间") private String username; @NotNull(message = "昵称不能为空",groups = Select.class) private String name; @NotNull(message = "密码不能为空",groups = ADD.class) private String password; @Email(message = "邮箱格式不合法",groups = Select.class) private String email; @Gender() private String gender; }
7.3、控制层示例,此时只会校验ADD组和Default组
//分组校验@PostMapping("/user")public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){ return ResponseEntity.ok(sysUser);}
以上就是关于"SpringBoot集成Validation参数校验的方法是什么"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
参数
用户
用户名
方法
元素
规则
内容
实体
注解
分组
格式
邮箱
长度
之间
密码
接口
数字
昵称
示例
范围
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
udi数据库怎么创建
已备案服务器
网络技术运维培训心得
深圳市爱卡蒙网络技术有限公司
海南工业软件开发代理价钱
扬州网络安全竞赛报名登录楚
网络安全行业业绩
远程连接服务器需要网段
服务器主机怎么用
检索数字资源数据库有哪些
数据库损坏游戏无法运行
msf 攻击服务器 2021
宁波嵌入式软件开发企业
暨南大学网络安全考研
计算机软件开发有前景吗
软件开发怎么控标
服务器推送数据到前端 qt
泰拉瑞亚1.4的服务器
提交金融信息数据库
数据库推广格式
mc服务器命令
校园网络安全教育主题简报
西部数据云服务器远程登录
网络安全标准论坛邀请函
湖南上智网络技术有限公司
软件开发工作评语
上海某某软件开发有限公司
游戏 云服务器
深度学习的框架和网络技术教程
服务器安装安全狗外网打不开