Hibernate Validator-校验注解使用归纳

news2024/11/19 5:49:59

文章目录

  • 前言
      • java-校验注解使用归纳
        • 1. 概述
        • 2. 引入依赖
        • 3. 手动抓取校验错误信息示例
        • 4. 自定义校验注解编写示例
        • 5. 统一配置校验错误信息示例

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java-校验注解使用归纳

1. 概述

Hibernate Validator 是一个基于 Java Bean 标准和注解的验证框架,它是 Hibernate 社区为 Java Bean 验证定义的一套实现。它是 Java Bean Validation(JSR 380)规范的参考实现。

Hibernate Validator 提供了一组注解,用于在 Java 对象上定义验证规则,并提供了验证器来校验对象是否符合指定的规则。通过使用这些注解和验证器,您可以在应用程序中方便地执行数据验证和验证错误的处理,确保数据的合法性和完整性,从而提高应用程序的数据质量和安全性。

2. 引入依赖

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.3.4.Final</version>
        </dependency>

3. 手动抓取校验错误信息示例

校验VO:


import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;
import java.math.BigDecimal;

/**
 * @author yangzhenyu
 * @version 1.0
 * @description:
 * @date 2023/7/21 14:50
 */
@Data
@ToString
public class TestFrom {
    @ApiModelProperty("金额")
    @DecimalMin(value = "0.009", message = "大于0")
    @Digits(message = "格式错误", integer = Integer.MAX_VALUE, fraction = 2)
    @NotNull(message = "不能为空")
    private BigDecimal money;

    @ApiModelProperty("id")
    @NotEmpty(message = "ID不能为空")
    private String id;
}

controller:

    @ApiOperation(value = "原生校验测试",notes = "原生校验测试")
    @RequestMapping(value = "/test/v1/checkTest",method = RequestMethod.POST)
    public TestVo checkTest(@Valid  @RequestBody TestFrom  searchParam, BindingResult result){
        if (result.hasErrors()) {
            List<String> collect = result.getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.toList());
            return TestVo.builder().errorMsg(String.join(",", collect)).build();
        }
        return TestVo.builder().build();
    }

在接受参数的地方加入BindingResult result参数,当校验注解校验住的时候,result.hasErrors()为true

测试:
输入:

{
  "id": "",
  "money": 1.12
}

输出:
在这里插入图片描述
输入:

{
  "id": "",
  "money": "0"
}

输出:
在这里插入图片描述

4. 自定义校验注解编写示例

示例判断传入日期格式是否正确:


/**
 * @author yangzhenyu
 * @version 1.0
 * @description: 注意只接受 日期字段以字符串的接受方式 使用:    @DateCheck(message = "操作日期结束时间格式不正确",patternDatetime = "yyyy-MM-dd")
 * @date 2023/7/21 17:40
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
        validatedBy = {DateCheckValidator.class}
)
@Documented
public @interface DateCheck {
    String message() default "时间格式不正确";

    String patternDatetime() default "yyyy-MM-dd HH:mm:ss";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

import org.example.validation.annotation.DateCheck;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @author yangzhenyu
 * @version 1.0
 * @description:
 * @date 2023/7/21 17:40
 */
public class DateCheckValidator implements ConstraintValidator<DateCheck, Object> {

    private String patternDatetime;
    @Override
    public void initialize(DateCheck dataCheck) {
        patternDatetime = dataCheck.patternDatetime();
    }

    public Boolean timeValidator(String time){
        try {
            SimpleDateFormat formatter = new SimpleDateFormat(patternDatetime);
            formatter.parse(time);
            return Boolean.TRUE;

        }catch (ParseException e){
            return Boolean.FALSE;
        }
    }
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        String time = String.valueOf(o);
        if (timeValidator(time)){
            return Boolean.TRUE;
        }else {
            return Boolean.FALSE;
        }
    }
}

在vo上字段上加上刚刚我们加上的注解

@Data
@ToString
public class TestFrom {
    @ApiModelProperty("金额")
    @DecimalMin(value = "0.009", message = "大于0")
    @Digits(message = "格式错误", integer = Integer.MAX_VALUE, fraction = 2)
    @NotNull(message = "不能为空")
    private BigDecimal money;

    @ApiModelProperty("id")
    @NotEmpty(message = "ID不能为空")
    private String id;

    @ApiModelProperty("创建日期")
    @DateCheck(message = "创建日期格式不正确",patternDatetime = "yyyy-MM-dd")
    private String createDate;
}

5. 统一配置校验错误信息示例

import org.example.vo.TestVo;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
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.servlet.http.HttpSession;

/**
 * @author yangzhenyu
 * @version 1.0
 * @description:
 * @date 2023/7/24 10:33
 */
@ControllerAdvice
@ConditionalOnExpression("${config.exception.switch:true} == true")
public class MyControllerAdvice {

    /**
     * 全局传参校验异常抓取
     * */
    @ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public TestVo bingException(MethodArgumentNotValidException e, HttpSession session){
        return TestVo.builder().errorMsg(e.getBindingResult().getFieldError().getDefaultMessage()).build();
    }
}

将刚刚我们设置的手动获取校验错误信息的BindingResult 类型的参数去掉:


    @ApiOperation(value = "原生校验测试",notes = "原生校验测试")
    @RequestMapping(value = "/test/v1/checkTest",method = RequestMethod.POST)
    public TestVo checkTest(@Valid  @RequestBody TestFrom  searchParam){
        return TestVo.builder().build();
    }

测试:
输入:

{
  "createDate": "string",
  "id": "",
  "money": 0
}

输出:
在这里插入图片描述
输入:

{
  "createDate": "string",
  "id": "1",
  "money": 0
}

输出:
在这里插入图片描述

输入:

{
  "createDate": "2023-07-23",
  "id": "1",
  "money": 0
}

输出:
在这里插入图片描述

输入:

{
  "createDate": "2023-07-23",
  "id": "1",
  "money": 1
}

在这里插入图片描述

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

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

相关文章

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)

安装支持MFC的vs2019&#xff08;解决MSBuild 错误 MSB8041、MSB8042&#xff09; 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后&#xff0c;即可解决MSBuild 错误 MSB8041 MSB8041&#xff1a;此项目需要 MFC/ATL 库。 https://learn.mic…

java读取资源路径的几种方式

Testpublic void path() throws IOException {System.out.println("用户当前工作目录"System.getProperty("user.dir"));File directory new File("");String path2 directory.getCanonicalPath();System.out.println("当前工作目录1:&qu…

0137 内存管理1

目录 3.内存管理 3.1内存管理概念 3.1部分习题 3.内存管理 3.1内存管理概念 3.1部分习题 1.内存保护需要由&#xff08;&#xff09;完成&#xff0c;以保证进程空间不被非法访问 A.操作系统 B.硬件机构 C.操作系统和硬件机构合作 D.操作系统或硬件…

【Ansible】自动化部署工具-----Ansible

自动化部署工具-Ansible 1.Ansible概述2.ansible环境安装部署2.1 command模块2.2 shell模块2.3 cron模块2.4 user模块2.5 group模块2.6 copy模块2.7 file模块2.8 hostname模块2.9 ping模块2.10 yum模块2.11 service/systemd模块2.12 script模块2.13 mount模块2.14 archive模块2…

比较18组二分类网络迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A&#xff0c;B中各有5个点&#xff0c;并且让这10个点的位置没有重合。比较迭代次数的顺序。 其中有18组数据 差值结构 A-B 迭代次数 构造平均列…

测试技术之测试用例质量的评估

第一&#xff0c;凭证测试用例的方式评估其品质&#xff0c;主要搜罗&#xff1a; 1)测试用例与需要规格剖析中需要条款的可追溯性&#xff0c;好比&#xff1a;咱们要求每一个需要条款至少有1个测试用例与之对于应。目的是为了评估测试的需要拆穿困绕率&#xff0c;以及合成需…

接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)

先了解下接口测试流程&#xff1a; 1、需求分析 2、Api文档分析与评审 3、测试计划编写 4、用例设计与评审 5、环境搭建&#xff08;工具&#xff09; 6、执行用例 7、缺陷管理 8、测试报告 那"接口自动化测试"怎么弄&#xff1f;只需要在上篇文章的基础上再梳理下就…

QT学习之旅 - 一个QT的基本项目

文章目录 定时器(时间)位置信息QTableWidget用cellwidget添加控件隐藏QTableWidget的滚动条自动调整适应大小 UDPUDP ClientUDP ServerUDP udpSocket.readDatagram重要参数使用多线程udp 自定义信号和槽UDP服务端接收数据(全局变量) QWT设置标题数轴相关设置坐标轴范围设置坐标…

赌博应用引风波,苹果、Meta、谷歌官司缠身,被视为“博彩公司”

一名美国法官认定&#xff0c;苹果、Meta、谷歌等科技巨头允许在其应用商店上架赌博应用程序的行为可能涉及从赌博活动中获利&#xff0c;类似于博彩公司。然而&#xff0c;该判决存在模糊的界限&#xff0c;并且法官认为这些公司有权提出上诉。 “苹果公司被指控在其应用商店上…

win11安装appium

node安装 node下载网址: Download | Node.js 安装后对node安装包路径进行配置 npm config set prefix “E:\nodejs\node_global” //设置全局包目录 npm config set cache “E:\nodejs\node_cache” //设置缓存目录npm config list //查看npm配置npm install -g appium //安…

Java 网络编程基础

文章目录 前言什么是网络编程网络编程基础知识网络通讯流程长连接和短连接Socket Java 网络编程总结 前言 一个网络请求、服务之间的调用都需要进行网络通讯&#xff0c;在日常开发时我们可能并不会关心我们的服务端是怎么接收到请求的、调用别的服务是怎么调用的&#xff0c;…

HCIP——OSPF不规则区域划分及LSA详解

ZY技术分享 一、OSPF与RIP异同二、OSPF的不规则区域划分1、远离骨干的非骨干使用tunnel隧道使用虚链路使用多进程双向重发布 2、不连续骨干 三、OSPF的LSA详解LSA头部Type - 1LSAType - 2LSAType - 3LSAType - 5LSAType - 4LSA 一、OSPF与RIP异同 OSPFRIP v1RIP v2链路状态路由…

行星碰撞(力扣)栈 JAVA

给定一个整数数组 asteroids&#xff0c;表示在同一行的行星。 对于数组中的每一个元素&#xff0c;其绝对值表示行星的大小&#xff0c;正负表示行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗行星以相同的速度移动。 找出碰撞后剩…

Mysql的增删改查

一.增加数据&#xff08;insert&#xff09; insert into 表名&#xff08;列名1&#xff0c;列名2&#xff0c;列名3&#xff0c;.....列名n&#xff09;values(值&#xff0c;值&#xff0c;值&#xff0c;....值&#xff09; insert into userinfo(id,name,age) values(&quo…

每日一题——除自身以外数组的乘积

除自身以外数组的乘积 题目链接 这一题乍一看好像十分简单&#xff0c;先用一趟循环遍历所有数据&#xff0c;得到数据所有元素的乘积&#xff0c;再用一趟循环将这个乘积除以每个元素&#xff0c;这样不就得到了除自身以外数组的乘积吗&#xff1f;我们先来看看代码&#xff…

janus-Gateway的服务端部署

janus-Gateway 需求是前后端的webRTC推拉流&#xff0c;但是后端用的是c&#xff0c;于是使用了这个库做视频流的推送和拉取&#xff0c;记录踩坑过程。 如果你也需要自己部署janus的服务端并在前端拉流测试&#xff0c;希望对你有所帮助。 由于janus的服务器搭建需要linux环境…

Python——Windows下载ffmpeg

目录 前言 一、下载 &#xff08;3种下载方式&#xff09; 1、第一种下载方式——我上传的文件 2、第二种下载方式——GitHub下载 3、第三种下载方式——官网下载 二、解压 三、配置环境变量 四、验证是否安装成功 五、其他 关于ffmpeg其他安装教程 ffmpeg的延迟问题 …

重生之再学mysql-数据库三范式

数据库三范式 介绍第一范式&#xff1a;确保每列都是不可拆分的第二范式&#xff1a;在第一范式的基础上&#xff0c;确保非主键列完全依赖于主键&#xff0c;而不是依赖于主键的一部分第三范式&#xff1a;第二范式的基础上&#xff0c;确保非主键列不存在传递依赖 介绍 什么…

“可以黑掉整个宇宙”的Metasploit Framework

0x01、 简述 Metasploit Framework(MSF)是一款开源安全漏洞检测工具&#xff0c;他带有数千个已知的软件漏洞&#xff0c;目前人在持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程&#xff0c;被安全社区冠以“可以黑掉整个宇宙”之名。在普通的…

Nginx最佳实践优化(动静分离、资源压缩、负载均衡、黑白名单等等)

一、前言 Nginx是目前负载均衡技术中的主流方案&#xff0c;几乎绝大部分项目都会使用它&#xff0c;Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 二、…