您现在的位置是:首页 > 正文

JSR-303数据校验 以及 分组校验

2024-04-01 04:30:45阅读 0

一、关于JSR

JSR是Java Specification Requests的缩写,意思是Java 规范提案。

是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。

任何人都可以提交JSR,以向Java平台增添新的API和服务。

JSR已成为Java界的一个重要标准。

二、关于 JSR-303

JSR-303 用于对 Java Bean 中的字段的值进行验证;

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation;

JSR-303 为Bean 验证定义了元数据模型和API,默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展。

三、常用的校验注解

分类:Bean Validation 中内置的 constraint

Constraint 详细信息
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Email 被注释的元素必须是电子邮箱地址
@Future 被注释的元素必须是一个将来的日期
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@NotBlank 被注释的字符串的必须非空
@NotEmpty 被注释的集合类的必须非空
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@Past 被注释的元素必须是一个过去的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式

分类:Hibernate Validator 附加的 constraint

Constraint 详细信息
@Length 被注释的字符串的大小必须在指定的范围内
@URL 被注释的元素必须是合法的URL地址
@Range 被注释的元素必须在合适的范围内

四、使用过程

1. 添加依赖

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

2. 为bean添加校验注解

@NotBlank(message = "用户名不能为空")
private String userName;

@NotNull(message = "邮箱不能为空")
@Email(message = "必须是邮箱地址类型")
private String email;

@NotNull(message = "reason信息不可以为空")
@Pattern(regexp = "[1-7]{1}", message = "reason的类型值为1-7中的一个类型")
private String reason;

message属性为校验失败时的提示信息,不添加会提示默认的响应信息。

3. 在需要校验的Controller上加上 @Valid注解

image-20220112014834948

4. 给校验的bean后紧跟一个BindingResult,获取校验的结果

image-20220112020822205

五、分组校验

应用场景:同一字段在不同业务逻辑下的校验规则是不同的

例如:

  • 添加数据时:实体类的 id 字段一定是的(因为 id 字段要由数据库主键自增添加)
  • 修改数据时:实体类的 id 字段一定是非空的(因为要通过 id 查找到要修改的实体)

基于以上业务逻辑,我们在对应的实体字段上添加注解:

image-20220113012244856

属性groups将字段的校验进行分组,在字段brandId进行属于不同业务的操作时,采用不同的校验规则,如:上面规定了在修改时,brandId字段不为空,在添加时,brandId字段必为空。

1. 创建分组——建两个接口,作为添加及修改的标识

image-20220113013036380

image-20220113013102242

2.在使用JSR303注解时添加group属性

上图介绍的group属性,其值为一个数组,可以添加多个分组

3.在添加及编辑操作时使用@Validated注解并指定其value值

image-20220113013503875

注意:由于注解内指定了该接口的校验分组,所以该注解只会校验group为该类型的属性值,所以没有指定相同group的属性值不会被校验。

例如下面这个例子,由于执行添加业务的接口已经有@Validated注解并指定其value值为AddGroup.class,所以在进行添加业务时,只会对brandId进行是否为空的校验,而不会对name字段进行校验:

image-20220113013906452

如需要对name字段进行校验,需要按如下方法为name字段添加分组:

image-20220113013936196

网站文章

  • [C++] LeetCode 135. 分发糖果

    题目老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻的孩子中,评分高的孩子必须获得更多的糖果。 那么这样下来,老师至少需要准备多少颗糖果呢? 示例 1: 输入: [1,0,2] 输出: 5 解释: 你可以分别给这三个孩子分发...

    2024-04-01 04:30:37
  • ffmpeg avformat_alloc_output_context2的使用说明

    封装格式输出说明

    2024-04-01 04:30:29
  • Java---第七章(抽象类,接口,多态,Object,异常处理)

    Java---第七章(抽象类,接口,多态,Object,异常处理)

    该文章主要讲解了Java语言中的抽象类,接口,多态,Object,异常处理等

    2024-04-01 04:29:51
  • MongoDB中的聚合(aggregate)查询($lookup、$unwind、$match、$project、$skip、$limit以及$sort操作符的使用)

    MongoDB中的聚合(aggregate)查询($lookup、$unwind、$match、$project、$skip、$limit以及$sort操作符的使用)

    文章目录一。概念二。集合示例准备三。各个操作符的用法1.$lookup2.$match3.$unwind4.$project5.$limit6.$skip7.$group8.$sort一。概念管道的概...

    2024-04-01 04:29:42
  • 即将步入大二的学期总结

    一.期末总结(1)这学期的学习任务比上学期的任务艰巨了许多,学习了Java,总体来说,学习只学到了表面,没有深层次的搞懂,也没有下来专研,导致学习时并没有很开心,为了完成任务而在学习,在心态上也出现了...

    2024-04-01 04:29:34
  • 排序

    //插入排序 public static void insertionSort(int[] arr) { for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j - 1; while (i...

    2024-04-01 04:29:26
  • Linux-编译链接过程及命令

    Linux-编译链接过程及命令

    编译链接过程 【1】预处理 源代码被预编译为一个 .i文件 在Linux下,对于一个已经编写好的main.c源程序,代码 gcc -E mainn.c -o main.i 完成对程序的预处理。 或者:cpp main.c &gt; main.i 预处理主要工作: 1.宏替换,展开所有宏定义 2.处理所有预编译指令,将包含的文件插入到预编译指令处 3.删除所有注释 4.添加行号...

    2024-04-01 04:28:46
  • C语言详细学生成绩管理系统

    C语言详细学生成绩管理系统

    C语言 学生成绩管理系统 简述:该学生管理系统数据结构采用结构体 1、系统需求分析 1.1系统介绍 本学生管理系统是为教师人员提供管理班级成绩的工具,该系统可以实现的对学生的成绩进行增、删、改、查、信...

    2024-04-01 04:28:40
  • 【错误记录】TabLayout 升级支持库版本后报错 ( support:design 支持库升级到 28.0.0 后源码发生变更 )

    【错误记录】TabLayout 升级支持库版本后报错 ( support:design 支持库升级到 28.0.0 后源码发生变更 )

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method &#39;void java.lang.reflect.Field.setAccessible(boolean)&#39; on a null object reference

    2024-04-01 04:28:33
  • 虚拟机NAT 有线被拔出 eth0卡消失

    宿主机VMware DHCP 和VMware NAT 服务没开

    2024-04-01 04:27:54