@validated的自定义注解校验编程式校验

news2024/9/20 18:31:48

自定义注解校验

前面的文章中,我们都是采用validate机制自带的条件注解来进行参数校验,
比如@Min、@NotNull…等等,
这些的确可以帮我们省去一部分的参数校验,可惜还有一部分的业务校验规则并不是如这般简单的,
比如前端传了一个日期过来,业务规则要求这个日期必须至少提前10天。
这样的校验规则就无法使用validate自带的条件注解来进行校验了,此时就需要我们自定义校验注解来实现校验规则。

现在,我们一起来看看自定义注解校验的用法;

首先定义一个校验注解

@Target({ElementType.FIELD})
// 可以用来修饰注解,是注解的注解,称为元注解,其他信息可参考:https://blog.csdn.net/qq_30326609/article/details/112360631
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 指定自定义的校验规则处理器
@Constraint(validatedBy = {MyDateValidHandler.class})
public @interface MyDateValid {

    String message() default "日期校验失败";

    Class<?>[] groups() default {};
	
	// 预加载,该属性必须要有,否则触发校验机制时会报错
    Class<? extends Payload>[] payload() default {};
}

自定义校验规则处理器

@Slf4j
public class MyDateValidHandler implements javax.validation.ConstraintValidator<MyDateValid, Date> {

    @Override
    public void initialize(MyDateValid constraintAnnotation) {
        // 初始化方法
    }

    @Override
    public boolean isValid(Date date, ConstraintValidatorContext constraintValidatorContext) {
        if(date == null){
            return true;
        }
        double diffDays = (1.0 * System.currentTimeMillis() - date.getTime()) / (3600000 * 24);
        return  diffDays >= 10;
    }
}

测试

	@PostMapping("/dataTypeValidTest")
    public DataTypeValidDTO dataTypeValidTest(@RequestBody @Validated DataTypeValidDTO dto){
        return dto;
    }

在这里插入图片描述
在这里插入图片描述

编程式校验

前面的例子中,都是通过@validated或@Valid注解来触发的,而且都是在controller层面进行校验,那假如我们想要在service层面进行校验呢,想要手动触发校验呢,应该要怎么做呢?

下面我们一起来看看编程式校验,它可以使我们在其他地方进行手动触发校验,实现步骤很简单,仅需要一个工具类即可,如下所示:

@Slf4j
@Component
public class ValidUtil<T> {

    @Autowired
    private javax.validation.Validator globalValidator;

    public String valid(T t){
        Set<ConstraintViolation<T>> validateRes = globalValidator.validate(t);
        if(CollectionUtils.isEmpty(validateRes)){
            return "";
        }
        StringBuilder errorMsg = new StringBuilder();
        errorMsg.append("校验失败:");
        for(ConstraintViolation<T> validateResTmp : validateRes){
            errorMsg.append(validateResTmp.getMessage()).append(";");
        }
        return errorMsg.toString();
    }
}

测试代码如下:

	@Autowired
    private HelloService helloService;

	@PostMapping("/userInvokeValidTest")
    public DataTypeValidDTO userInvokeValidTest(@RequestBody DataTypeValidDTO dto){
        return helloService.userInvokeValidTest(dto);
    }



@Service
@Slf4j
public class HelloService {

    @Autowired
    private ValidUtil validUtil;

    public DataTypeValidDTO userInvokeValidTest(DataTypeValidDTO dto){
        dto.setValidMsg(validUtil.valid(dto));
        return dto;
    }
}

在这里插入图片描述
好了,到这里涉及到的@Validated和@Valid注解校验机制的常用方式就讲完了,感谢大家的聆听,拜拜

示例源代码:https://download.csdn.net/download/weixin_43846505/87982259

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 程序设计入门

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

mybatis web使用01

CREATE TABLE t_act ( id bigint auto_increment, actno varchar(255) NOT NULL, balance int(11) default 0, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 创建 maven web 工程 在 IntelliJ IDEA 上使用 Maven 创建 web 工程的步骤如下&#xff1a; 在…

机器学习-方差和偏差理论

机器学习-方差和偏差理论 关于机器学习方差和偏差的内容其实很重要&#xff0c;这个方差和偏差可以帮助我们去分析&#xff0c;模型的泛化能力和过拟合的程度。 下面我们先给存储方差和偏差的公式&#xff1a; 注意&#xff0c;下式当中&#xff0c; f ( x ; D ) 表示在数据集…

jmeter测并发

文章目录 jmeter是什么安装使用1、测试计划2、线程组3、添加请求4、添加报告开始测试 jmeter是什么 Apache JMeter是一个开源的负载测试工具&#xff0c;用于评估和分析系统的性能和功能。它可以模拟多种类型的负载&#xff0c;包括 Web 应用程序、数据库服务器、FTP 服务器等…

密码找回安全总结-业务安全测试实操(29)

密码重置凭证与用户账户关联不严 有些信息系统在密码找回功能的校验逻辑上存在缺陷,只校验了密码重置凭证是否在 数据库中存在,但未严格校验该重置凭证和用户账号之间的绑定关系。这种密码重置凭证 与用户账户关联不严的逻辑漏洞就让攻击者可以通过在数据包中修改用户账号达…

全志V3S嵌入式驱动开发(解决kernel 5.2.y 网卡驱动问题)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于v3s网卡驱动&#xff0c;之前我们已经实现了。而且&#xff0c;它还是我们移植的第一个v3s驱动&#xff0c;之前的内容地址在这个地方&#xf…

ATTCK(五)之ATTCK子项目invoke-atomicredteam的安装与使用

ATT&CK子项目invoke-atomicredteam的安装与使用 Invoke_atomicredteam介绍 Invoke-AtomicRedTeam 是一个 PowerShell 模块&#xff0c;用于执行在Red Canary 的 Atomic Red Team 项目的atomics 文件夹中定义的测试。“atomics”包含由MITRE ATT&CK™ 框架定义的每个技…

jupyter notebook优化

一&#xff0e;这个是jupyter notebook主题设置的相关教程&#xff0c;如果经常看着高亮的屏幕&#xff0c;对于眼睛会是一种损伤&#xff01; https://blog.csdn.net/qq_41566627/article/details/104984796?utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7…

[RocketMQ] Broker接收消息入口源码 (九)

文章目录 1.Broker处理请求入口1.1 registerProcessor注册消息处理器1.2 NettyServerHandler处理请求1.3 processRequestCommand分发处理请求1.3.1 rejectRequest是否拒绝请求 2.asyncProcessRequest异步处理请求2.1 asyncProcessRequest异步处理请求 3.总结 1.Broker处理请求入…

海康威视网络摄像头通过浏览器网页的配置流程

一、登录 输入网络摄像机IP地址&#xff0c;显示登录窗口&#xff0c;输入用户名和密码后&#xff0c;点击登录。如果是新设备&#xff0c;需要先激活设备&#xff0c;设置登录密码。&#xff08;Edge浏览器如何访问海康设备&#xff1f;&#xff09; 二、界面介绍 登入界面后…

logstash收集日志到elasticsearch

1.前言 logstash是一个相对较重的日志收集器&#xff0c;可以通过多种方式获取到日志数据&#xff0c;如tcp、日志文件、kafka、redis、rabbitmq等方式&#xff0c;还可以使用filter去过滤日志、转换日志为json格式&#xff0c;所以logstash是一个功能强大的日志收集器&#x…

六、神经网络完整训练流程(MNIST数据集为例)

一、下载数据集 MNIST数据集 将下载好的数据集解压放入同级项目路径下 二、导包 import torch import torch.nn as nnn import torch.optim as optim import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np from torchvision import datase…

华芯微特SWM34-IO速度优化之模拟SPI写速度提速

本文以在SWM34S&#xff08;M33内核,150Mhz&#xff0c;编译器Keil MDK 5.36&#xff09;上优化为例&#xff0c;说明优化方法和需要注意的地方&#xff0c;其他MCU可以参考。 在编写模拟SPI通信驱动LCD的例子的时候&#xff0c;会用到一个发送字节的核心函数&#xff0c;其基本…

【JavaSE】初步认识

目录 【1】Java语言概述 【1.1】Java是什么 【1.2】Java语言重要性 【1.3】Java语言发展简史 【1.4】Java语言特性 【1.5】 Java开发环境安装 【2】初识Java的main方法 【2.1】main方法示例 【2.2】运行Java程序 【3】注释 【3.1】基本规则 【3.2】注释规范 【4】…

ESP32-S2启动异常分析

客户反馈最近一批50块基于ESP32-S2的LoRaWAN gateway&#xff0c;有5块偶尔网络灯能亮&#xff0c;经常不能亮。 反复分析&#xff0c;定位&#xff0c;一个共同现象是用示波器看&#xff0c;串口输出一串信息后再没输出了。因为用了 ESP-ROM:esp32s2-rc4-20191025 Build:Oct …

企业构建知识库方案

AI模型理解误区&#xff1a;百万成本微调垂直行业达模型VS低成本建立企业专属知识库或ai助理_哔哩哔哩_bilibili

vscode关闭调试工具栏

问题描述 项目启动的时候老是蹦出这玩意 很碍眼 解决方案&#xff1a; 设置里搜索 选项改为hidden即可

前端Vue自定义注册界面模版 手机号邮箱账号输入框 验证码输入框 包含手机号邮箱账号验证

前端Vue自定义注册界面模版 手机号邮箱账号输入框 验证码输入框 包含手机号邮箱账号验证 &#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13306 效果图如下&#xff1a;

CSS 备忘录2-动画、渐变、颜色、选择器等

1、背景 background属性是八个属性的简写形式&#xff1a; background-image 指定一个文件或生成的颜色渐变作为背景图片background-position 设置图片的初始位置background-size 指定背景图片的渲染尺寸background-repeat 是否平铺图片ba…

缺少msvcp140.dll丢失该如何解决?

msvcp140.dll是什么东西?相信很多人都遇到过msvcp140.dll这个文件吧?那么为什么一丢失msvcp140.dll电脑软件就会打不开?如果缺失了这个东西会怎么样?小编今天就来给大家详细的说说&#xff0c;其实这些都是一些比较常见的电脑知识&#xff0c;我们是需要去了解一下的。 msv…