热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

@valid对数组校验_JSR303快捷完成数据校验

在开发工作中,前端对提交的数据交验完后,后台代码也必须做一次校验,否则安全方面得不到保障,但每次都得手动校验非常麻烦
在开发工作中,前端对提交的数据交验完后,后台代码也必须做一次校验,否则安全方面得不到保障,但每次都得手动校验非常麻烦,工作量大,重复性强,效率低下。这个时候JSR303可以帮到您!要实现自动校验小编整理了两种方式一,小编推荐方式二。maven依赖

org.springframework.bootgroupId>    spring-boot-starter-validationartifactId>dependency>公共代码User类

/** * @author Wgy * @date 2020/11/25 18:09 * @describe 用户实体类 */@Datapublic class User implements Serializable { private static final long serialVersionUID = -425383051343505767L; @NotBlank(message = "姓名不能为空") private String name; @NotBlank(message = "邮箱不能为空") @Email(message = "必须为邮箱格式") private String email; @NotNull(message = "必须填写年龄") @Min(value = 0, message = "年龄必须大于等于0") private Integer age;}方式一:

1.添加依赖

2.在bean的属性上添加校验注解

3.在控制器接收参数的前面紧跟@Valid注解,表示该参数需要校验

4.在控制器需要校验的参数后面紧跟BindingResult类,校验的异常信息会复制到BindingResult对象,根据对象获取检验异常返回信息

  /** * &#64;author Wgy * &#64;date 2020/11/26 11:15     * &#64;describe 后台接收&#xff0c;方式一  */ &#64;GetMapping(value &#61; "/getUser1") public Map mode1(&#64;Valid User user, BindingResult result) { Map map &#61; new HashMap<>(); //获取错误信息 List fieldErrors &#61; result.getFieldErrors(); //遍历错误信息 fieldErrors.forEach(item -> { String field &#61; item.getField(); String defaultMessage &#61; item.getDefaultMessage(); map.put(field, defaultMessage); }); if (fieldErrors.size() <&#61; 0) map.put("data", user); return map; }

返回

9858e599e4f6324d6db8cbfe2d62933b.png

方式二&#xff1a;使用全局异常统一处理的方式步骤&#xff1a;

1.添加依赖

2.在bean的属性上添加校验注解

3.在控制器接收参数的前面紧跟&#64;Valid注解&#xff0c;表示该参数需要校验

4.使用全局异常处理方式拦截校验异常&#xff0c;在处理异常的方法上获取校验异常信息返回

首先定义全局异常处理类

/** * &#64;author Wgy * &#64;date 2020/11/25 18:56 * &#64;describe 全局异常类 */&#64;RestControllerAdvice(basePackageClasses &#61; JController.class)public class ExceptionControllerAdvice { &#64;ExceptionHandler(value &#61; BindException.class) public JSONObject handleVaildException(BindException e) { JSONObject json &#61; new JSONObject(); BindingResult result &#61; e.getBindingResult(); result.getFieldErrors().forEach(item -> { String message &#61; item.getDefaultMessage(); String field &#61; item.getField(); json.put(field, message); }); System.out.println("异常");        return json;    }}参数接收

/** * &#64;author Wgy * &#64;date 2020/11/26 11:42 * &#64;describe 方式二 */ &#64;GetMapping(value &#61; "/getUser2") public String mode2(&#64;Valid User user) { return user.toString(); }

返回

3e339c1a0fc75db5d625e31d33d0ff8f.png

主编推荐方式二&#xff0c;一次处理全局使用&#xff0c;让开发人员只注重业务逻辑的开发。


下面是JSR303的注解说明&#xff1a;

空检查

&#64;Null 验证对象是否为null

&#64;NotNull 验证对象是否不为null, 无法查检长度为0的字符串

&#64;NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.

&#64;NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

&#64;AssertTrue 验证 Boolean 对象是否为 true

&#64;AssertFalse 验证 Boolean 对象是否为 false

长度检查

&#64;Size(min&#61;, max&#61;) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内

&#64;Length(min&#61;, max&#61;) Validates that the annotated string is between min and max included.

日期检查

&#64;Past 验证 Date 和 Calendar 对象是否在当前时间之前&#xff0c;验证成立的话被注释的元素一定是一个过去的日期

&#64;Future 验证 Date 和 Calendar 对象是否在当前时间之后 &#xff0c;验证成立的话被注释的元素一定是一个将来的日期

&#64;Pattern 验证 String 对象是否符合正则表达式的规则&#xff0c;被注释的元素符合制定的正则表达式&#xff0c;regexp:正则表达式 flags: 指定 Pattern.Flag 的数组&#xff0c;表示正则表达式的相关选项。

数值检查

建议使用在Stirng,Integer类型&#xff0c;不建议使用在int类型上&#xff0c;因为表单值为“”时无法转换为int&#xff0c;但可以转换为Stirng为”“,Integer为null

&#64;Min 验证 Number 和 String 对象是否大等于指定的值

&#64;Max 验证 Number 和 String 对象是否小等于指定的值

&#64;DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度

&#64;DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度

&#64;Digits 验证 Number 和 String 的构成是否合法

&#64;Digits(integer&#61;,fraction&#61;) 验证字符串是否是符合指定格式的数字&#xff0c;interger指定整数精度&#xff0c;fraction指定小数精度。

&#64;Range(min&#61;, max&#61;) 被指定的元素必须在合适的范围内

&#64;Range(min&#61;10000,max&#61;50000,message&#61;”range.bean.wage”)

&#64;Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)

&#64;CreditCardNumber信用卡验证

&#64;Email 验证是否是邮件地址&#xff0c;如果为null,不进行验证&#xff0c;算通过验证。

&#64;ScriptAssert(lang&#61; ,script&#61;, alias&#61;)

&#64;URL(protocol&#61;,host&#61;, port&#61;,regexp&#61;, flags&#61;)


90b3d1456e52c1f880ad3bc3eab14bc3.png




推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
真实的米零星_826
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有