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

springboot手动触发参数校验,service层调用参数校验

背景

入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现,但是有时候我们的方法不提供给controller调用,这时候就无法触发自动参数校验,为此我们可以在不更改校验代码的前提下手动触发spring的参数校验。

代码实现

  • 触发工具类
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;/*** @description validator参数校验类*/
public class ValidateUtil {private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();/*** 校验实体类* @param t  参数* @param notNull t是否可以为空*/public static <T> void validate(T t, boolean notNull) {if (t == null) {if (notNull) {throw new ValidationException("参数不能为空");}return;}Set<ConstraintViolation<T>> constraintViolations = VALIDATOR.validate(t);if (constraintViolations.size() < 1) {return;}for (ConstraintViolation<T> constraintViolation : constraintViolations) {throw new ValidationException(constraintViolation.getMessage());}}public static <T> void validate(T t) {validate(t, false);}public static <T> void validate(List<T> list) {validate(list, false);}/*** @description: 参数校验* @date 11:59 2024/6/7* @param list* @param notNull list是否可以为空**/public static <T> void validate(List<T> list, boolean notNull) {if (list == null || list.isEmpty()) {if (notNull) {throw new ValidationException("参数不能为空");}return;}list.forEach(item -> {Set<ConstraintViolation<T>> constraintViolations = VALIDATOR.validate(item);if (constraintViolations.size() < 1) {return;}for (ConstraintViolation<T> constraintViolation : constraintViolations) {throw new ValidationException(constraintViolation.getMessage());}});}/*** 通过组来校验实体类* @param t 参数* @param notNull t是否可以为空* @param groups 校验组*/public static <T> void validate(T t, boolean notNull, Class<?>... groups) {if (t == null) {if (notNull) {throw new ValidationException("参数不能为空");}return;}Set<ConstraintViolation<T>> constraintViolations = VALIDATOR.validate(t, groups);if (constraintViolations.size() < 1) {return;}for (ConstraintViolation<T> constraintViolation : constraintViolations) {throw new ValidationException(constraintViolation.getMessage());}}public static <T> void validate(T t, Class<?>... groups) {validate(t, false, groups);}
}
  • 使用
// 方法入参
public class RefundOrderParam {@ApiModelProperty(value = "总退款金额", required = true)@NotNull(message = "总退款金额不能为空", groups = {InsertGroup.class, UpdateGroup.class})private BigDecimal totalRefundMoney;@ApiModelProperty(value = "是否原路退", required = true)@NotNull(message = "是否原路退不能为空", groups = {InsertGroup.class, UpdateGroup.class})private Boolean originalRefund;
}
//触发校验
ValidateUtil.validate(request, UpdateGroup.class);
http://www.lryc.cn/news/368589.html

相关文章:

  • 动手学深度学习4.10 实战Kaggle比赛:预测房价-笔记练习(PyTorch)
  • 1035 插入与归并(测试点6)
  • 什么情况下需要使用分布式事务,有哪些方案?
  • Java加密体系结构参考指南-Java Cryptography Architecture
  • C++中避免内存泄漏的方法
  • 5.1 实体完整性
  • (学习笔记)数据基建-数据质量
  • WINUI——Behavior(行为)小结
  • Ruoyi5.x RuoYi-Vue-Plus新建Translation翻译类
  • 类加载的奥秘
  • Spring知识点总结
  • STM32Cube系列教程11:STM32 AES加解密模块性能测试
  • Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。
  • 【数据结构与算法】使用单链表实现队列:原理、步骤与应用
  • DHCP服务
  • C++笔试-剑指offer
  • Mac安装jadx并配置环境
  • 前端学习----css基础语法
  • 超详解——python条件和循环——小白篇
  • DNS协议 | NAT技术 | 代理服务器
  • 深入ES6:解锁 JavaScript 类与继承的高级玩法
  • 领域驱动设计:异常处理
  • 网络网络层之(6)ICMPv6协议
  • 《大道平渊》· 拾壹 —— 商业一定是个故事:讲好故事,员工奋发,顾客买单。
  • JavaScript 如何访问本地文件夹
  • ArrayList顺序表简单实现
  • 144、二叉树的前序递归遍历
  • youtube 1080 分辨率 下载方式
  • 计算机网络ppt和课后题总结(下)
  • 测试基础12:测试用例设计方法-边界值分析