Hibernate Validator-校验注解使用归纳

文章目录

  • 前言
      • 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.mfbz.cn/a/46503.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】App仿写--管理系统

文章目录 前言一、账号界面二、功能界面三、添加功能四、删除功能五、更改功能六、查找功能七、排序功能八、退出功能总结 前言 在日常生活中&#xff0c;如果用文字来记述与管理我们数据会十分麻烦&#xff0c;并且人工成本较高&#xff0c;这里笔者给出一种管理系统的模版&a…

[回馈]ASP.NET Core MVC开发实战之商城系统(二)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页商品类型&#xff0c;bann…

【iOS】—— RunLoop和多线程相关问题总结

RunLoop 1. 讲讲RunLoop&#xff0c;项目中有用到过吗&#xff1f; RunLoop 的基本作用&#xff1a;保持程序的持续运行&#xff0c;节省 CPU 的资源&#xff0c;提高程序的性能 &#xff08; 没有事情&#xff0c;就请休眠&#xff0c;不要功耗。有事情&#xff0c;就处理&a…

二、SQL-6.DCL-1).用户管理

一、DCL介绍 Data Control Language 数据控制语言 用来管理数据库 用户、控制数据库的 访问权限。 二、语法 1、管理用户 管理用户在系统数据库mysql中的user表中创建、删除一个用户&#xff0c;需要Host&#xff08;主机名&#xff09;和User&#xff08;用户名&#xff0…

json-server创建静态服务器2

上次写的 nodejs创建静态服务器 这次再来个v2.0 利用json-server很方便就可以实现。 vscode打开文件夹&#xff0c;文件夹所在终端&#xff1a; json-server.cmd --watch db.json 这里视频教程是没有上述命令标红的&#xff0c;但是会报错&#xff0c;具体不详&#xff0c…

Docker私有仓库部署与管理

目录 Docker--harbor Harbor 简介 Harbor 部署 1. 部署 Docker-Compose 服务 2. 部署 Harbor 服务 维护管理Harbor 1. 通过 Harbor Web 创建项目 2. 创建 Harbor 用户 3. 查看日志 4. 修改 Harbor.cfg 配置文件 5. 移除 Harbor 服务容器同时保留镜像数据/数据库&…

Unity Profiler或UPR连接WebGL应用出错

问题 在使用Unity Build出WebGL应用进行性能测试的时候&#xff0c;勾选上了 Development Build和Autoconnect Profiler&#xff0c;分别使用Profiler和UPR进行测试 现象 使用Profiler测试时&#xff0c;就收到几帧&#xff0c;然后就没了 使用UPR进行测试时&#xff0c;在…

python简单入门

python简单入门 文章目录 python简单入门0. 地址链接1. 官网2.2. 下载地址3. 官方文档 1. 第一章1.1 python解释器1.2 基础语法1.2.1 常见数据类型1.2.2 强制类型转换1.2.3 注释1.2.4 运算符1.2.5 字符串1.2.5.1 字符串的定义1.2.5.2 字符串拼接1.2.5.3 格式化字符串1.2.5.3 精…

jenkins部署Springboot项目

文章目录 jenkins部署Springboot项目步骤创建一个jenkins任务开始配置准备步骤添加shell脚本(两个)你放一个执行也行构建成功后执行脚本 如何在linux上安装jenkins可以看上一篇 linux安装jenkins(详细步骤) jenkins部署Springboot项目步骤 创建一个jenkins任务 开始配置 ![在这…

error: /tmp/ccxy1wo0.o: multiple definition of ‘tgt_flow_thread_init‘

linux 项目使用Makefile 编译代码时&#xff0c;一直报错 从报错意思上看很明确&#xff0c;就是重复定义 tgt_flow_thread_init函数 但是我从全局搜索代码看根本不存在重复定义问题。 从网上看是说可能存在头文件有重复的定义或者头文件被重复的引用&#xff0c;但是我看了…

el-table树形表格实现复选框多选效果

2023.7.26今天我学习了如何使用树形表格的时候进行复选框的多选效果。 当我们使用树形结构表格需要进行多选功能操作的时候会发现点击全选的时候&#xff0c;只有一级表格数据会被选中&#xff0c;问题如图&#xff1a; 我们需要实现的是点击全选的不管是几级表格数据都可以被…

策略模式的实现与应用:掌握灵活算法切换的技巧

文章目录 常用的设计模式有以下几种&#xff1a;一.创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;二.结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;三.行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a;四.并发…

k8s使用helm部署Harbor镜像仓库并启用SSL

1、部署nfs存储工具 参照&#xff1a;https://zhaoll.blog.csdn.net/article/details/128155767 2、部署helm 有多种安装方式&#xff0c;根据自己的k8s版本选择合适的helm版本 参考&#xff1a;https://blog.csdn.net/qq_30614345/article/details/131669319 3、部署Harbo…

matplotlib从起点出发(4)_Tutorial_4_Lifecycle

1 一幅图像的生命周期 本教程旨在揭示使用matplotlib绘制的一幅图像的生命周期&#xff0c;包括它的开始、中间和结束。我们将从一些原始数据开始&#xff0c;最后保存自定义可视化的图形。在此过程中&#xff0c;我们尝试使用matplotlib突出一些简洁的功能和最佳实践。 2 关…

三子棋(超详解+完整码源)

三子棋 前言一&#xff0c;游戏规则二&#xff0c;所需文件三&#xff0c;创建菜单四&#xff0c;游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game&#xff08;&#xff09;函数内部具体实现 四&#xff0c;游戏运行实操 前言 C语言实现三子棋…

maven

一、为什么需要使用maven 如今我们构建一个项目需要用到很多第三方的类库 &#xff0c;例如我们在开发项目中 需要引入 这些依赖jar包 一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系非常复杂&#xff0c;一个Jar包往往又会引用其他Jar包&#x…

安全学习DAY07_其他协议抓包技术

协议抓包技术-全局-APP&小程序&PC应用 抓包工具-Wireshark&科来分析&封包 TCPDump&#xff1a; 是可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用…

stable diffusion如何确保每张图的面部一致?

可以使用roop插件&#xff0c;确定好脸部图片后&#xff0c;使用roop固定&#xff0c;然后生成的所有图片都使用同一张脸。 这款插件的功能简单粗暴&#xff1a;一键换脸。 如图所示&#xff1a; 任意上传一张脸部清晰的图片&#xff0c;点击启用。 在其他提示词不变的情况下…

赛多利斯Sartorius天平java后端对接

业务场景 要将赛多利斯天平的数据读出来解析并且显示到对应的数字框,支持一台设备连接多种精度的天平 后端实现 通过协议解析数据,然后将数据存储 详细代码就不贴了,感兴趣的可以私聊我

GPT-AI 使用的技术概览

ChatGPT 使用的技术概览 智心AI-3.5/4模型&#xff0c;联网对话&#xff0c;MJ快速绘画 从去年 OpenAI 发布 ChatGPT 以来&#xff0c;AI 的能力再次惊艳了世人。在这样的一个时间节点&#xff0c;重新去学习相关技术显得很有必要。 ChatGPT 的内容很多&#xff0c;我计划采用…
最新文章