当前位置: 首页 > news >正文

【Java实战】不会还有人用if else进行参数校验吧

当请求参数很多,几乎每一个参数都需要后端去兜底校验时,你还在写if else去判断参数是否为空吗??要校验为空的参数三四个还好,要是十几个,业务逻辑还没开始就写二三十行代码开始堆山了嘛,教给大家一个简单实用的方法,让大家不再在屎堆上堆代码。

注解篇

先来了解几个常用的注解

注解含义怎样使用
@NotBlank字符串不为null且非空格长度至少为1注解在String类型的参数上
@Null必须为null用于Long、Integer、BigDecimal基本数据类型上
@NotNull必须不为null用于Long、Integer、BigDecimal基本数据类型上
@NotEmpty集合不为null且长度>0用于集合校验
@AssertTrue为true用于Boolean类型上
@AssertFalse为false用于Boolean类型上
@Max小于或等于某个数一个字段的最大值为xx
@Min大于或等于某个数一个字段的最小值为xx
@Digits(integer=3, fraction=2)整数和小数长度
@Pattern正则匹配手机号规则校验等
@Range(min=,max=)数值类型范围
@Length字符串长度范围----

实战篇

请求参数

BizRequestDTO

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;import javax.validation.Valid;
import java.util.Date;
import java.util.List;@Data
public class BizRequestDTO {/*** 单据编号*/@NotBlank(message = "headId (单据编号)不能为空")private String headId;/*** 金额*/@NotNull(message = "amount (金额)不能为空")private BigDecimal amount;/*** 提单人*/@Validprivate EmpInfoDTO submitter;/*** 分摊人列表*/@Validprivate List<EmpInfoDTO> expenseSharerList;
}

注解释义 @Valid

作用于对象,作用于集合 对象内校验方式:

    @Validprivate EmpInfoDTO submitter;

EmpInfoDTO

    /*** 工号*/@NotBlank(message = "工号不能为空")private String workNo;/*** 姓名*/@NotBlank(message = "姓名不能为空")private String nickName;

在代码中如何写?

引入依赖

        <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.16.Final</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency>

引入一个工具类

import org.hibernate.validator.HibernateValidator;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;public class ValidatorUtils {private static final Validator DEFAULT_VALIDATOR;static {DEFAULT_VALIDATOR = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory().getValidator();}public static <T> Set<ConstraintViolation<T>> validate(T bean) {return DEFAULT_VALIDATOR.validate(bean);}
}

实际应用

    public ResponseResult<String> checkExpenseParams(RequestParamDTO requestDTO) {Set<ConstraintViolation<TaeExpenseLineCheckRequestDTO>> result = ValidatorUtils.validate(requestDTO);// 错误信息输出StringBuilder resultInfo = new StringBuilder();result.forEach(validateResult -> resultInfo.append(validateResult.getMessage()).append("\n"));if (StringUtils.isNotBlank(resultInfo)) {return ResponseResult.error(resultInfo.toString());}// 若为空则参数校验通过return ResponseResult.ok(null);}

输出示例

headId (单据编号)不能为空
amount (金额)不能为空

校验模式配置

Hibernate可以对校验模式的配置,支持快速失败,即在校验的过程中只要有一项不同过,剩余的参数就不再进行校验。默认使用的是全部校验完成后再返回,也就是在上面的例子中展示的那样。开启快速失败的具体的实现方式:

Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();

校验工具类

import org.hibernate.validator.HibernateValidator;import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.Validation;
import java.util.Set;public class ValidatorUtils {private static final Validator DEFAULT_VALIDATOR;private static final Validator FAST_VALIDATOR;static {DEFAULT_VALIDATOR = Validation.byProvider(HibernateValidator.class).configure().buildValidatorFactory().getValidator();FAST_VALIDATOR = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();}public static <T> Set<ConstraintViolation<T>> validate(T bean) {return DEFAULT_VALIDATOR.validate(bean);}public static <T> Set<ConstraintViolation<T>> fastValidate(T bean) {return FAST_VALIDATOR.validate(bean);}
}

快速校验使用方式同上,输出示例

headId (单据编号)不能为空

对象级联校验

包含级联对象的类

对象级联校验意味着,在一个对象中的属性可以包含另外一个校验对象,被级联的对象需要用@Valid注解修饰。上面也有给出🌰,本节再详细讲解一下。

例:

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;@Data
public class ValidatorWithDefineExtraModel {@NotBlank(message="姓名不能为空")private String name;@NotNull(message = "年龄不能为空")@Range(min=1, max=200, message = "年龄必须大于1小于200")private Integer age;@NotBlank(message="性别不能为空")@Pattern(regexp = "([FM])", message = "性别只能为F(女)或者M(男)")private String sex;@NotNull(message = "validatorModelExtra不能为空")@Validprivate ValidatorModelExtra validatorModelExtra;
}

被级联的对象

@Data
public class ValidatorModelExtra {@NotNull(message = "地址不能为空")@Length(max = 100, message = "地址长度不能大于100个字符")private String address;
}

输出示例:

地址不能为空

相关文章:

【Java实战】不会还有人用if else进行参数校验吧

当请求参数很多&#xff0c;几乎每一个参数都需要后端去兜底校验时&#xff0c;你还在写if else去判断参数是否为空吗&#xff1f;&#xff1f;要校验为空的参数三四个还好&#xff0c;要是十几个&#xff0c;业务逻辑还没开始就写二三十行代码开始堆山了嘛&#xff0c;教给大家…...

深度学习部署(十六): CUDA RunTime API _vector-add 使用cuda核函数实现向量加法

1. 知识点 nthreads的取值&#xff0c;不能大于block能取值的最大值。一般可以直接给512、256&#xff0c;性能就是比较不错的 (input_size block_size - 1) / block_size;是向上取整 对于一维数组时&#xff0c;采用只定义layout的x维度&#xff0c;若处理的是二维&#xff…...

堆结构的两个应用

堆排序 堆结构很大的一个用处&#xff0c;就是用于堆排序了&#xff0c;堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2​n)量级的&#xff0c;在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候&#xff0c;首先认为我必须得有一个堆数据结构…...

Java中的 static

1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量&#xff0c;也叫做类变量 静态变量被所有的对象所共享&#xff0c;在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量 也可以通过对象名.静态变量…...

基于Vision Transformer的图像去雾算法研究与实现(附源码)

基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及内存使用率&#xff0c;配合nvidia-smi监控GPU使用率 可以了解服务器性能是否足够&#xff1b;运行时在哪一步使用率突然…...

服务器相关常用的命令

cshell语法 https://www.doc88.com/p-4985161471426.html domainname命令 1&#xff09;查看当前系统域名 domainname2&#xff09;设置并查看当前系统域名 domainname example.com3&#xff09;显示主机ip地址 domainname -Iwhich命令 which 系统命令在 PATH 变量指定的…...

今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日

目录 一、库函数计算 π 二、近似值计算 π 三、无穷级数计算 π 四、割圆术计算 π 五、蒙特卡罗法计算 π 六、计算800位精确值 从2020年开始&#xff0c;每年的3月14日又被定​为国际数学日​&#xff0c;是2019年11月26日​联合国教科文组织​第四十届大会上正式宣布…...

Qt Quick - StackLayout 堆布局

StackLayout 堆布局一、概述二、attached 属性三、例子1. 按钮切换 StackLayout 页面一、概述 StackLayout 其实就是说&#xff0c;在同一个时刻里面&#xff0c;只有一个页面是展示出来的&#xff0c;类似QStackWidget 的功能&#xff0c;主要就是切换界面的功能。这个类型我…...

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程&#xff0c;源代码来自上面视频&#xff0c;侵删&#xff0c;这里只是做笔记&#xff0c;以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…...

RK3568平台开发系列讲解(网络篇)什么是Socket套接字

🚀返回专栏总目录 文章目录 一、什么是socket ?二、socket 理解为电话机三、socket 的发展历史四、套接字地址格式4.1、通用套接字地址格式4.2、IPv4 套接字格式地址4.3、IPv6 套接字地址格式4.4、几种套接字地址格式比较沉淀、分享、成长,让自己和他人都能有所收获!😄 …...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题——渗透测试解析(详细)

渗透测试 任务环境说明: 服务器场景:Server9服务器场景操作系统:未知(关闭连接)系统用户名:administrator密码:123456通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,以xml格式向指定文件输出信息(使用工具Nmap),将以xml格式向指定文件输出…...

尚融宝03-mybatis-plus基本CRUD和常用注解

目录 一、通用Mapper 1、Create 2、Retrieve 3、Update 4、Delete 二、通用Service 1、创建Service接口 2、创建Service实现类 3、创建测试类 4、测试记录数 5、测试批量插入 三、自定义Mapper 1、接口方法定义 2、创建xml文件 3、测试条件查询 四、自定义Serv…...

vue多行显示文字展开

这几天项目里面有一个需求&#xff0c;多行需要进行展开文字&#xff0c;类似实现这种效果 难点就在于页面布局 一开始就跟无头苍蝇似的&#xff0c;到处百度 &#xff0c;后面发现网上的都不适合自己&#xff0c;最终想到了解决方案 下面是思路&#xff1a; 需求是超过3行&a…...

SpringBoot:SpringBoot 的底层运行原理解析

声明原文出处&#xff1a;狂神说 文章目录1. pom.xml1 . 父依赖2 . 启动器 spring-boot-starter2. 主启动类的注解1. 默认的主启动类2. SpringBootApplication3. ComponentScan4. SpringBootConfiguration5. SpringBootApplication 注解6. spring.factories7. 结论8. 简单图解3…...

哪些场景会产生OOM?怎么解决?

文章目录 堆内存溢出方法区(运行时常量池)和元空间溢出直接内存溢出栈内存溢出什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下来基本上4个场景可以概括下来。 堆内存溢出…...

金三银四、金九银十 面试宝典 Spring、MyBatis、SpringMVC面试题 超级无敌全的面试题汇总(超万字的面试题,让你的SSM框架无可挑剔)

Spring、MyBatis、SpringMVC 框架 - 面试宝典 又到了 金三银四、金九银十 的时候了&#xff0c;是时候收藏一波面试题了&#xff0c;面试题可以不学&#xff0c;但不能没有&#xff01;&#x1f941;&#x1f941;&#x1f941; 一个合格的 计算机打工人 &#xff0c;收藏夹里…...

JAVA开发(Spring框架详解)

javaweb项目几乎已经离不开spring框架了&#xff0c;spring 是一个典型的分层架构框架&#xff0c;它包含一系列的功能并被分为多个功能模块&#xff0c;springboot对spring框架又做了一层封装&#xff0c;以至于很多人对原来的spring框架越来越不了解。 要谈Spring的历史&…...

自学大数据第八天~HDFS命令(二)

嗨喽,好久不见,最近抽空复习了一下hadoop,书读百遍,其意自现这句话还真是; 继续学习HDFS常用命令 改变文件 拥有者~chown hdfs dfs -chown -R hadoop /user/hadoop使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是超级用户。 改变文件所属组-chgrp hdfs dfs -chgr…...

贪心算法(几种常规样例)

贪心算法&#xff08;几种常规样例&#xff09; 贪心算法&#xff0c;指在对问题进行求解的时候&#xff0c;总是做出当前看来是最好的选择。也就是说不从整体上最优上考虑&#xff0c;算法得到的结果是某种意义上的局部最优解 文章目录贪心算法&#xff08;几种常规样例&…...

【数据结构】基础知识总结

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了数据结构复习用的&#xff0c;由于牛客刷题发现数据结构方面和王道数据结构的题目非常像&#xff0c;甚至很多都是王道中的&#xff0c;所以将基础知识进行了整理&#xff0c;后续会将牛客刷题的错题一…...

AppleRa1n:解锁iOS设备激活锁的专业指南与安全实践

AppleRa1n&#xff1a;解锁iOS设备激活锁的专业指南与安全实践 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当您面对一台被激活锁困住的iPhone或iPad时&#xff0c;那种无助感就像是拥有一把无法打…...

别再用yield了!FastAPI 2.0官方弃用警告下的流式响应新范式(含ASGI StreamingResponse + async iterator最佳实践)

第一章&#xff1a;FastAPI 2.0流式响应弃用背景与演进动因FastAPI 2.0 将 StreamingResponse 的默认行为从“自动分块传输”转向显式、可控的流式语义&#xff0c;其核心动因源于对 HTTP/1.1 分块编码&#xff08;Chunked Transfer Encoding&#xff09;与现代客户端&#xff…...

雷达式多参数水文监测站

雷达式多参数水文监测站用先进的非接触式测量技术&#xff0c;结合水库断面参数精准计算流量&#xff0c;全程无需接触水体&#xff0c;从根源上规避水体环境对监测设备的影响。不受风、环境温度、雾霾、水体泥沙、漂浮物等外界因素干扰&#xff0c;即便在汛期水流浑浊、漂浮物…...

SDMatte镜像轻量化:去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB

SDMatte镜像轻量化&#xff1a;去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB 1. 项目背景与挑战 SDMatte是一款面向高质量图像抠图的AI模型&#xff0c;特别擅长处理复杂边缘和半透明物体的抠图任务。在电商、设计、内容创作等领域有着广泛的应用场景。然而&#xff0c;原…...

LFM2.5-1.2B-Thinking-GGUF快速部署:CSDN平台一键克隆→启动→分享链接三步到位

LFM2.5-1.2B-Thinking-GGUF快速部署&#xff1a;CSDN平台一键克隆→启动→分享链接三步到位 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。这个模型采用GGUF格式存储&#xff0c;配合llama.cpp运行时&…...

AutoGen Studio中的强化学习应用:智能决策系统开发

AutoGen Studio中的强化学习应用&#xff1a;智能决策系统开发 1. 引言 想象一下&#xff0c;你正在构建一个智能决策系统&#xff0c;需要让多个AI代理协同工作&#xff0c;像一支训练有素的团队一样做出复杂决策。传统方法需要大量编码和调试&#xff0c;但现在有了AutoGen…...

央国企稳岗扩岗新举措解读

近日&#xff0c;国家层面再次强调了就业优先战略的重要性&#xff0c;并推动相关政策措施进一步升级。在这一宏观背景下&#xff0c;中央企业和国有企业作为国民经济的重要支柱&#xff0c;其在稳就业、扩岗位方面的举措备受关注。一系列新的行动方案正陆续出台&#xff0c;旨…...

如何高效将LocalSend打包为MSIX:完整Windows商店发布实战指南

如何高效将LocalSend打包为MSIX&#xff1a;完整Windows商店发布实战指南 【免费下载链接】localsend localsend - 一个开源应用程序&#xff0c;允许用户在本地网络中安全地共享文件和消息&#xff0c;无需互联网连接&#xff0c;适合需要离线文件传输和通信的开发人员。 项…...

基于RS485(Modbus RTU)的工业RFID读写器CK-FR03-A01与三菱FX5U PLC的通信配置与实战应用

1. 工业RFID与PLC通信的基础认知 在自动化产线上&#xff0c;RFID读写器就像给物料贴"身份证"的智能哨兵&#xff0c;而PLC则是控制流水线动作的大脑。CK-FR03-A01这款工业级RFID读写器&#xff0c;通过RS485接口采用Modbus RTU协议与三菱FX5U PLC对话&#xff0c;就…...

透明显示屏技术应用:汽车挡风玻璃可直接显示导航信息

透明显示屏技术在汽车挡风玻璃的应用透明显示屏技术通过将导航信息、车速、路况等关键数据直接投射到挡风玻璃&#xff0c;实现驾驶员无需低头即可获取信息。这种技术被称为平视显示系统&#xff08;HUD&#xff09;&#xff0c;能显著提升行车安全性和便利性。原理与实现方式 …...