Hibernate-Validator(数据校验框架)

news2025/7/11 4:28:41

目录

    • 一、Hibernate-Validator 简介
    • 二、项目中为什么要用校验框架
    • 三、添加依赖
    • 四、看一个入门级案例
    • 五、常用注解
    • 六、使用groups的校验

一、Hibernate-Validator 简介

hibernate-validatorHibernate项目中的一个数据校验框架,它能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。

官网地址:http://hibernate.org/validator/documentation


二、项目中为什么要用校验框架

Java程序开发中,当你要处理一个程序的业务逻辑时,请求参数的数据校验是必须要处理的。当请求参数格式不正确的时候,需要程序监测到,并且返回对应的错误提示,以此来达到数据校验的目的。对于前后端分离开发过程中,数据校验还需要返回对应的状态码和错误提示信息。

三、添加依赖

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

如果使用了springboot,则不需要引用任何依赖,因为spring-boot-starter-web包中已经包含了Hibernate-Validator 依赖。
在这里插入图片描述


四、看一个入门级案例

  • 现有一个实体类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class StudentPo {
        @NotBlank(message = "用户名不能为空")
        private String name;
    
        @NotBlank(message = "邮箱不能为空")
        private String email;
    }
    
  • POST接口控制器
    POST请求必须要加@Valid

    // 注意:@Valid 不加这个注解,@NotBlank注解不生效
    @RestController
    public class StudentPoController {
        @RequestMapping(value = "/addStudent", method = RequestMethod.POST)
        public String addStudent(@Valid @RequestBody StudentPo student){
            System.out.println("student = [" + student + "]");
            return "ok";
        }
    }
    
  • 用postman测试
    在这里插入图片描述

  • 这种参数校验出现的异常,我们可以用全局异常处理类处理

    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseBody
        public ResultEntity handleBindException(MethodArgumentNotValidException ex) {
            FieldError fieldError = ex.getBindingResult().getFieldError();
            return ResultEntity.faill(211, fieldError.getDefaultMessage(), null);
        }
    }
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class ResultEntity<T> {
        private Integer code;
    
        private String message;
    
        private T data;
    
        public static <T> ResultEntity<T> faill(Integer code, String msg, T t) {
            return new ResultEntity<T>(code, msg, t);
        }
    }
    
  • 再次用postman测试
    在这里插入图片描述

  • 外加一个GET接口的控制器的写法

    // Get请求需要在类上添加@Validated
    @RestController
    @Validated
    public class StudentController {
     
        @RequestMapping(value = "/addStudent1",method = RequestMethod.GET)
        public String addStudent1(@NotBlank(message = "name不能为空") String name){
            System.out.println("name = [" + name + "]");
            return "ok addStudent1";
        }
    }
    

五、常用注解

注解说明用法例子
@Nul被注释的元素必须为 null
@NotNull被注释的元素必须不为 null@NotNull 用在基本类型
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内,元素必须为集合,代表集合个数
@Pattern(regexp = )正则表达式校验
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Email被注释的元素必须是电子邮箱地址
@Length(min=, max=)被注释的字符串的大小必须在指定的范围内,必须为数组或者字符串,若微数组则表示为数组长度,字符串则表示为字符串长度
@NotEmpty被注释的字符串的必须非空@NotEmpty 用在集合类上面
@Range(min=, max=)被注释的元素必须在合适的范围内
@NotBlank被注释的字符串的必须非空@NotBlank 用在String上面
@URI字符串是否是一个有效的URL

注意:
1.@NotNull:不能为null,但可以为empty(“”," “,” “)
2.@NotEmpty:不能为null,而且长度必须大于0 (” “,” ")
3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0(“test”) 即:必须有实际字符


六、使用groups的校验

  • 1、情景说明
    同一个对象要复用,比如UserDTO在更新时候要校验userId,在保存的时候不需要校验userId,在两种情况下都要校验username,那就用上groups了:

  • 第一步:先定义groups的分组接口Create和Update

    import javax.validation.groups.Default;
    
    public interface Create extends Default {
    }
    
    import javax.validation.groups.Default;
    
    public interface Update extends Default{
    }
    
  • 第二步:再在需要校验的地方@Validated声明校验组

    /**
         * 走参数校验注解的 groups 组合校验
         *
         * @param userDTO
         * @return
         */
        @PostMapping("/update/groups")
        public RspDTO update(@RequestBody @Validated(Update.class) UserDTO userDTO) {
            userService.updateById(userDTO);
            return RspDTO.success();
        }
    
    
  • 第三步:在DTO中的字段上定义好groups = {}的分组类型

    @Data
    public class UserDTO implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        /*** 用户ID*/
        @NotNull(message = "用户id不能为空", groups = Update.class)
        private Long userId;
    
        /**
         * 用户名
         */
        @NotBlank(message = "用户名不能为空")
        @Length(max = 20, message = "用户名不能超过20个字符", groups = {Create.class, Update.class})
        @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "用户昵称限制:最多20字符,包含文字、字母和数字")
        private String username;
    
        /**
         * 手机号
         */
        @NotBlank(message = "手机号不能为空")
        @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误", groups = {Create.class, Update.class})
        private String mobile;
    
        /**
         * 性别
         */
        private String sex;
    
        /**
         * 邮箱
         */
        @NotBlank(message = "联系邮箱不能为空")
        @Email(message = "邮箱格式不对")
        private String email;
    
        /**
         * 密码
         */
        private String password;
    
        /*** 创建时间 */
        @Future(message = "时间必须是将来时间", groups = {Create.class})
        private Date createTime;
    
    }
    

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

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

相关文章

-防火墙-

数据来源 一、防火墙的基本概念 防火墙的定义&#xff1a;是一款具备安全防护功能网络设备 ◆ 隔离网络 将需要保护的网络与不可信任网络进行隔离&#xff0c;隐藏信息并进行安全防护 防火墙基本功能&#xff1a; ◆ 访问控制 - ACL ◆ 攻击防护 ◆ 冗余设计 ◆ 路由、交…

基于XMC4800 Ethercat从站的工厂自动化解决方案

背景 随着“工业4.0”与“工业互联网”概念的提出&#xff0c;“互联网制造”的概念被大众所熟知&#xff0c;人们称之为第四次工业革命。在这样的背景下&#xff0c;新的工业自动化孕育而生。智能工厂、提供智能工厂设计与实施的工业4.0解决方案商、技术供应商相继出现。ARRO…

Android---Banner轮播图

轮播图是一种很常见的UI。Banner框架能够帮助我们快速开发&#xff0c;完成首页轮播图效果的需求。 1、导入Banner依赖 implementation io.github.youth5201314:banner:2.2.2 2、activity_main.xml布局。 banner_loop_time: 设置轮播间隔时间&#xff0c;默认3000&#xff…

逆天了!用Numpy开发深度学习框架,透视神经网络训练过程

哈喽&#xff0c;大家好。 今天给大家分享一个非常牛逼的开源项目&#xff0c;用Numpy开发了一个深度学习框架&#xff0c;语法与 Pytorch 基本一致。 今天以一个简单的卷积神经网络为例&#xff0c;分析神经网络训练过程中&#xff0c;涉及的前向传播、反向传播、参数优化等核…

制作圣诞帽其实特简单(附 Python 代码)

圣诞将至&#xff0c;虽然咱不过这洋节&#xff0c;但是热闹还是要凑一下的&#xff0c;相信已经有很多圣诞帽相关的周边在流传了&#xff0c;今天咱们就自己动手&#xff0c;给头像增加一个圣诞帽。 文章目录基础知识准备数字图像图像通道ROI和mask矩阵&#xff08;Numpy&…

BaseAdapter实现的投票案例

BaseAdapter实现的投票案例 1.知识补充 android:descendantFocusability"blocksDescendants"&#xff0c;关键是让谁先去获取焦点beforeDescendants&#xff1a;viewgroup会优先其子类控件而获取到焦点afterDescendants&#xff1a;viewgroup只有当其子类控件不需要获…

Flink Process Function

处理函数: ProcessFunction: 含有状态流的特性 处理函数面对的是数据流中的最基本元素: 数据事件 event, 状态 state, 时间 time 文章目录1.基本处理函数 ProcessFunction1.1 处理函数的功能和使用1.2 ProcessFunction 解析2.处理函数的分类2.1 按键分区处理函数 KeyedProces…

LaTex期刊模板下载与使用

1 LaTex期刊模板下载与使用 接上文介绍了LaTex的下载安装和基本语法使用规则。 上文地址&#xff1a;科研人快速入门LaTex到日常使用&#xff0c;下载安装配置&#xff0c;语法使用说明等 一般来说&#xff0c;LaTeX主要用在论文提交&#xff0c;书籍排版过程中&#xff0c;提…

Kubernetes:Pod

文章目录1、Pod 定义2、Pod 使用2.1、init 容器2.2、容器生命周期处理函数2.3、容器的探测2.3.1、探测机制2.3.2、探测结果2.3.3、探测类型startupProbereadinessProbelivenessProbe2.3.4、案例2.4、测试代码3、Pod 的部署3.1、Deployment3.2、DaemonSets3.3、静态 pod4、参考p…

我国金属包装行业企业数量下降 经济效益整体表现不佳 但亏损额减少

根据观研报告网发布的《中国金属包装市场发展趋势研究与未来投资预测报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;金属包装是指采用金属薄板,针对不同用途制作的各种不同形式的薄壁包装容器,相较于其它包装&#xff0c;金属包装因为其材质特性&#xff0c;比一般…

3DEXPERIENCE平台2023新功能揭秘!Governance云端数据管理解决方案

3DEXPERIENCE平台更新版本已经与大家见面&#xff0c;今天众联亿诚与大家分享Governance新功能。 多年来&#xff0c;我们一直在寻找SOLIDWORKS数据管理的更优解决方案。但就是感觉很艰难&#xff0c;硬件投资是昂贵的&#xff0c;实施是资源密集型的&#xff0c;更重要的是&a…

【TypeScript】TS入门(一)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Hook原理

对于会Hook的人来说,Hook其实也就那么回事.对于没有Hook过的人来说,会感觉Hook很高大上(其实也没毛病). 那么今天我们就来探讨一些Hook的原理是什么. 我认为任何Hook都可以分为以下三步(简称WFH): 需要Hook的是什么,在哪里(后面简称Where). 寻找到Hook的地方.(后面简称Find)…

JavaScript基础(15)_数组

对象分为三种&#xff1a;内建对象、宿主对象、自定义对象。 内建对象 内建对象是指由ECMAScript事先提供的、不依赖于宿主环境的对象&#xff0c;这些对象在程序运行之前就已经存在&#xff0c;并可以直接在程序中任何地方任何时候拿来使用。常见的内建对象可以直接通过new调…

【JavaEE】Servlet

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【Servlet】1.0Servlet概述写一个Servlet程序1. 创建项目2. 引入Servlet依赖3. 创建目录结构4. 编写代码5. 打包程序6. 部署程序7. 验证程序【Servlet 2.0】访问出错【小结】追求想要的一定很酷&#xff01; 【Serv…

docker rootless安装

rootless 简介 rootless模式允许以非root用户身份运行Docker守护程序和容器&#xff0c;以减轻守护程序和容器运行时中的潜在漏洞。只要满足先决条件&#xff0c;即使在Docker守护程序安装期间&#xff0c;无根模式也不需要root特权。无根模式是Docker Engine v19.03中引入的一…

【俄罗斯方块】单机游戏-微信小程序项目开发入门

这是一个仿俄罗斯方块小游戏的微信小程序&#xff0c;只需要写一小段代码就实现出来了&#xff0c;有兴趣的同学完全可以自己动手开发&#xff0c;来看看实现过程是怎样的呢&#xff0c;边写边做&#xff0c;一起来回忆小时候玩过的经典俄罗斯方块游戏吧。 文章目录创建小程序页…

certbot生成证书,配置nginx,利用脚本自动续期

踩了大量坑&#xff0c;做下记录。以下适用于博主本人&#xff0c;但是未必会适用于所有人 单域名与泛域名证书生成 sudo certbot certonly --standalone --email 邮箱 -d 域名# 单域名certbot certonly --preferred-challenges dns --manual -d *.baidu.com(修改这里) --ser…

【檀越剑指大厂—Springboot】Springboot高阶

一.整体介绍 1.什么是 Springboot? Springboot 是一个全新的框架&#xff0c;简化 Spring 的初始搭建和开发过程&#xff0c;使用了特定的方式来进行配置&#xff0c;让开发人员不再需要定义样板化的配置。此框架不需要配置 xml&#xff0c;依赖于 maven 这样的构建系统。 …

嵌入式分享合集125

一、多层板PCB设计中电源平面相对地平面要进行内缩&#xff1f; 有一些人绘制的PCB&#xff0c;在GND层和电源层会进行一定程度的内缩设计&#xff0c;那么大家有没有想过为什么要内缩呢。 需要搞清楚这个问题&#xff0c;我们需要来先了解一个知识点&#xff0c;那就是“20H”…