【Java 中级】一文精通 Spring MVC - 数据验证(七)

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 1. 什么是数据验证
      • 2. 数据验证的应用场景
      • 3. SpringMVC @Validator 使用方法
      • 4. SpringMVC 自定义数据验证案例

1. 什么是数据验证

SpringMVC 数据验证是指在 SpringMVC 框架中对用户提交的数据进行验证,确保数据的合法性和有效性。通过数据验证,可以防止无效或恶意的数据进入系统,提高系统的安全性和稳定性。以下是 SpringMVC 数据验证的相关内容:

  1. 注解驱动验证:SpringMVC 提供了一系列的注解,如 @NotNull、@NotEmpty、@Min、@Max 等,用于对请求参数进行验证。可以将这些注解应用到控制器方法的参数上,或者在实体类的属性上进行验证。

示例:

@RequestMapping("/example")
public String example(@NotNull @Min(18) Integer age, @NotEmpty String name) {// 验证年龄不为空且大于等于18,姓名不为空// 处理业务逻辑return "example";
}
  1. 自定义验证器:除了使用注解进行验证外,还可以创建自定义的验证器来实现更复杂的验证逻辑。自定义验证器需要实现 Spring 的 Validator 接口,并在控制器方法或配置文件中进行注册。

通过以上方式,SpringMVC 可以方便地进行数据验证,确保数据的合法性和有效性。这有助于提高系统的安全性和可靠性。

2. 数据验证的应用场景

数据验证的应用场景广泛,适用于各种需要确保数据合法性和有效性的场景。以下是一些常见的数据验证应用场景:

  1. 表单验证:在用户提交表单数据时,验证输入的数据是否符合要求。例如,验证必填字段是否为空、验证邮箱格式是否正确、验证密码是否符合规定的复杂度等。

  2. 数据库操作:在进行数据库操作之前,对数据进行验证,以确保数据的完整性和一致性。例如,验证外键关联是否存在、验证唯一约束是否满足等。

  3. API 接口验证:在接收到外部请求时,对请求参数进行验证,以确保请求的合法性和安全性。例如,验证请求参数的类型和范围、验证请求头信息是否正确等。

  4. 身份验证:在用户登录或访问敏感信息时,对用户身份进行验证,以确保用户的合法性和权限。例如,验证用户名和密码是否匹配、验证访问令牌是否有效等。

  5. 数据转换和格式化:在将数据从一种格式转换为另一种格式时,进行数据验证,以确保转换的准确性和有效性。例如,将字符串转换为日期对象时,验证字符串是否符合日期格式。

  6. 业务规则验证:根据业务需求,对数据进行特定的验证。例如,验证订单金额是否超过用户账户余额、验证商品库存是否足够等。

数据验证在应用开发中扮演着重要的角色,可以保证数据的质量和一致性,提高系统的稳定性和安全性。

3. SpringMVC @Validator 使用方法

SpringMVC 中的 @Validator 注解用于对数据进行验证,确保数据的合法性和有效性。以下是 @Validator 的使用案例:

  1. 创建验证器类:
@Component
public class MyValidator implements Validator {@Overridepublic boolean supports(Class<?> clazz) {return MyObject.class.equals(clazz);}@Overridepublic void validate(Object target, Errors errors) {ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.empty", "姓名不能为空");// 其他验证规则}
}

在上述示例中,我们创建了一个名为 MyValidator 的验证器类,实现了 Validator 接口,并重写了 supports() 和 validate() 方法。supports() 方法用于指定该验证器支持的验证对象类型,validate() 方法用于实现具体的验证逻辑。

  1. 在控制器中使用 @Validator 注解:
@Controller
public class MyController {@Autowiredprivate MyValidator validator;@InitBinderprotected void initBinder(WebDataBinder binder) {binder.addValidators(validator);}@RequestMapping("/example")public String example(@Validated MyObject myObject, BindingResult result) {if (result.hasErrors()) {// 处理验证错误return "error";}// 处理业务逻辑return "example";}
}

在上述示例中,我们在控制器类中使用了 @Validator 注解,并在 initBinder() 方法中将自定义的验证器 MyValidator 添加到 WebDataBinder 中。然后,在处理请求的方法中使用 @Validated 注解标记需要验证的对象,并使用 BindingResult 参数接收验证结果。

通过这样的配置和使用,SpringMVC 会自动调用验证器对请求参数进行验证,验证结果会存储在 BindingResult 对象中。我们可以根据验证结果进行相应的处理,例如返回错误页面或处理业务逻辑。

4. SpringMVC 自定义数据验证案例

SpringMVC 中的数据验证可以通过自定义验证注解和验证器来实现。以下是一个自定义数据验证的案例:

  1. 创建自定义验证注解:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {String message() default "自定义验证失败";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

在上述示例中,我们创建了一个名为 MyCustomValidation 的自定义验证注解。通过 @Constraint 注解指定了该注解的验证器类为 MyCustomValidator,并定义了一些默认的属性。

  1. 创建自定义验证器:
public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {@Overridepublic void initialize(MyCustomValidation constraintAnnotation) {// 初始化验证器}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 自定义验证逻辑,返回 true 表示验证通过,返回 false 表示验证失败return value != null && value.startsWith("ABC");}
}

在上述示例中,我们创建了一个名为 MyCustomValidator 的自定义验证器类,实现了 ConstraintValidator 接口,并指定了该验证器对应的注解类型为 MyCustomValidation。在 isValid() 方法中实现了自定义的验证逻辑,判断字符串是否以 “ABC” 开头。

  1. 在实体类中使用自定义验证注解:
@Data
public class MyEntity {@MyCustomValidationprivate String myField;}

在上述示例中,我们在实体类 MyEntity 的字段 myField 上使用了自定义的验证注解 @MyCustomValidation。

  1. 在控制器中进行数据验证:
@Controller
public class MyController {@RequestMapping("/example")public String example(@Valid MyEntity myEntity, BindingResult result) {if (result.hasErrors()) {// 处理验证错误return "error";}// 处理业务逻辑return "example";}
}

在上述示例中,我们在处理请求的方法中使用了 @Valid 注解来触发数据验证,并使用 BindingResult 参数接收验证结果。如果验证结果中存在错误,我们可以根据需要进行相应的处理。

通过自定义验证注解和验证器,我们可以实现更加灵活和复杂的数据验证逻辑,以满足具体的业务需求。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法通关村第8关【黄金】| 寻找祖先问题

思路&#xff1a;递归三部曲 第一步&#xff1a;确定参数和返回值 题目要求找到指定的结点&#xff0c;就需要返回结点。 题目又涉及到p,q就需要传入p,q&#xff0c;需要遍历传入root 第二步&#xff1a;确定终止条件 当遍历到结点为空说明到底没找到返回空 或者遍历到p,…

飞腾平台芯片测试固件(SFW)和开机启动log

一、说两句 最近公司飞腾产品越来越多了&#xff0c;FT-2000/4的D2000的X100的&#xff0c;最近又新出了E2000。越来越多新来的小孩儿开始加入到飞腾的调测试中&#xff0c;那么在他们实际的调试中会遇到很多的问题。在固件启动阶段有的板卡会有一些异常&#xff0c;有时我们需…

ChatGPT 与 Python进行动态可视化分析

Python数据分析目前最为热门的岗位操作。 想使用Python进行可视化分析&#xff0c;但是又不想写代码&#xff0c;测试&#xff0c;验证。可以交给ChatGPT&#xff0c;open AI 来进行操作。 这样的动态图显示&#xff0c;我们只需要给ChatGPT发送一个指令&#xff0c;人工智能就…

用AI + Milvus Cloud搭建着装搭配推荐系统教程

以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…

新方案unity配表工具

工具下载&#xff1a;网盘链接 工具结构&#xff1a;针对每张表格生成一个表格类&#xff0c;其中默认包含一个list和字典类型参数记录表格数据&#xff0c;初始化项目时将list中的数据转为按id索引的dictionary&#xff0c;用于访问数据。额外包含一个同名Temp后缀的类&#…

docker使用harbor进行镜像仓库管理演示以及部分报错解决

目录 一.安装harbor和docker-compose 1.下载 2.将该文件修改为这样&#xff0c;修改好自己的hostname和port&#xff0c;后文的用户和密码可以不改也可以改&#xff0c;用于登录 3.安装 二.修改daemon.json文件和/etc/hosts文件 三.使用powershell作windows端域名映射 四…

Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置

文章目录 总的介绍补充&#xff08;用于摄像机跟随的场景&#xff09; 总的介绍 transform.LookAt 是 Unity 引擎中 Transform 组件的一个方法&#xff0c;用于调整一个物体的旋转&#xff0c;使其朝向指定的位置。通常情况下&#xff0c;它被用来使一个物体&#xff08;如摄像…

无涯教程-PHP - preg_match_all()函数

preg_match_all() - 语法 int preg_match_all (string pattern, string string, array pattern_array [, int order]); preg_match_all()函数匹配字符串中所有出现的模式。 它将按照您使用可选输入参数order指定的顺序将这些匹配项放置在pattern_array数组中。有两种可能的类…

韶音的骨传导耳机怎么样,韶音骨传导耳机值得入手吗

韶音在骨传导耳机中&#xff0c;也存在着一定的影响力&#xff0c;并且目前就款式而言&#xff0c;关于骨传导耳机的产品韶音最新发布的还是去年的OpenRun Pro&#xff0c;从外观上具备了七种颜色可以挑选&#xff0c;颜值上可以说是比较耐打的&#xff0c;配置方面对于现在需求…

java八股文面试[JVM]——类加载器

一、类加载器的概念 类加载器是Java虚拟机用于加载类文件的一种机制。在Java中&#xff0c;每个类都由类加载器加载&#xff0c;并在运行时被创建为一个Class对象。类加载器负责从文件系统、网络或其他来源中加载类的字节码&#xff0c;并将其转换为可执行的Java对象。类加载器…

window如何实时刷新日志文件

1 安装windows git 下载地址&#xff1a;Git - Downloading Package (git-scm.com) 2 打开git bash 输入tail.exe -f 日志文件路径

【集合学习ConcurrentHashMap】ConcurrentHashMap集合学习

ConcurrentHashMap集合学习 一、JDK1.7 和 1.8 版本ConcurrenHashMap对比分析 JDK 1.7版本 在JDK 1.7版本ConcurrentHashMap使用了分段锁的方式&#xff08;对Segment进行加锁&#xff09;&#xff0c;其实际结构为&#xff1a;Segment数组 HashEntry数组 链表。由很多个 …

【科研】-- 如何将Endnote中参考文献格式插入到Word?

文章目录 如何将Endnote中参考文献格式插入到Word&#xff1f; 如何将Endnote中参考文献格式插入到Word&#xff1f; 1、首先确保Endnote和Word安装正确&#xff0c;正常可以从学校官网中下载到正版软件&#xff0c;下载后在word栏目中会出现EndNote的标签&#xff1b; 2、可…

探索音视频出海的无限可能|中企出海领袖班第八期成功举办

​近年来&#xff0c;音视频社交出海赛道的热度吸引了众多企业纷纷进军海外市场。然而&#xff0c;面对复杂多变的海外市场&#xff0c;无论是产品的本地化策略&#xff0c;还是对海外网络环境的适应以及网络安全防御等因素&#xff0c;都成为决定产品能否在海外市场脱颖而出的…

软件工程(十四) 设计模式之结构型模式(二)

1、组合模式 简要说明 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 速记关键字 树形目录结构 类图如下 由类图其实可以看出,组合模式就是将具有父子关系的结构,组装形成一棵树,并且根据规范,树干节点和叶子节…

深入了解OpenStack:创建定制化QCOW2格式镜像的完全指南

OpenStack 创建自定义的QCOW2格式镜像 前言 建议虚机网络配置为 NAT 或 桥接&#xff0c;因为未来 KVM虚机 需要借助 虚机 的外网能力进行联网安装软件包 虚机在启动前&#xff0c;必须在 VMware Workstation 上为其开启虚拟化引擎 虚拟化 Intel VT-x/EPT 或 AMD-V 安装kvm …

Nelson-Siegel-Svensson in Python;使用纳尔逊-西格尔-斯文森估计即期汇率曲线(1994)

一、说明 Nelson-Siegel-Svensson &#xff08;1994&#xff09; 模型通过添加 1987 个额外的曲线估计参数来修改 Nelson-Siegel &#xff08;2&#xff09; 模型。虚拟任何收益率曲线形状都可以使用这两种模型进行插值&#xff0c;这两种模型在世界各地的银行中广泛使用。 图1…

【位运算进阶之----右移(>>)】

&#x1f604;嘻嘻&#xff0c;朋友们&#xff0c;大家好&#xff01;昨天我们学习了左移&#xff0c;今天我们来谈谈右移>>。 ⭐️简单来说&#xff0c;右移就是将一个数二进制表达整体向右移动&#xff0c;也就是去掉一个数的二进制表达的末位&#xff0c;右移一位就去…

Linux用户与组管理(02)(七)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、批量创建 二、修改属性 三、密码设置 四、删除 总结 前言 今天学习的是上次剩余的用户组的内容&#xff0c;也是相对于刚学习Linux系统比较重要的部分&#x…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比&#xff0c;ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…