Spring MVC数据校验

news2024/11/24 3:53:41

一般情况下,用户的输入是随意的,为了保证数据的合法性,数据验证是所有 Web 应用必须处理的问题。

Spring MVC 有以下两种方法可以验证输入:

  • 1.利用 Spring 自带的验证框架(复杂,推荐spring-boot-starter-validation)

  • 2.利用 JSR 303 实现

数据验证分为客户端验证和服务器端验证,

客户端验证主要是过滤正常用户的误操作,通过 JavaScript 代码完成。

服务器端验证是整个应用阻止非法数据的最后防线,通过在应用中编程实现。

本节使用 JSR 303 实现服务器端的数据验证

JSRJSR

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

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

任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。关于 JSR-303JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现,Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint

JSR 303 是 Java 为 Bean 数据合法性校验所提供的标准框架。JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。可以通过 The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 303 查看详细内容并下载 JSR 303 Bean Validation。

JSR 303 不需要编写验证器,它定义了一套可标注在成员变量、属性方法上的校验注解,如下表所示。只针对对象属性的校验

注解含义
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注释的元素的字符串长度大小必须在指定的范围内
@Digits (integer,fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式 Hibernate Validator附加的constraint
@NotBlank(message =)验证字符串非null,且长度必须大于0
@Email被注释的元素必须是电子邮箱地址
@Length(min=,max=)被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range(min=,max=,message=)被注释的元素必须在合适的数字范围内

Spring MVC 支持 JSR 303 标准的校验框架,Spring 的 DataBinder 在进行数据绑定时,可同时调用校验框架来完成数据校验工作,(当发生错误时候触发BindException)非常简单方便。在 Spring MVC 中,可以直接通过注解驱动的方式来进行数据校验。

Spring 本身没有提供 JSR 303 的实现,Hibernate Validator 实现了 JSR 303,所以必须在项目中加入来自 Hibernate Validator 库的 jar 文件,下载地址为 The Bean Validation reference implementation. - Hibernate Validator

maven依赖

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.3.Final</version>
</dependency>

效验:在product类中对实体进行效验

private Integer id;
    @NotEmpty(message = "name不能为空")
    private String name;

    private BigDecimal price;
    //第一种方式:
    //@Min(value=5,message="数量最小为5")    
    //@MAx(value=100,message="数量最大为100")
    //第二种方式
    @Range(min = 5,max = 10,message = "大小必须在这个范围内")
    private Integer qty;
    private List<String> address;
    private String email;
    private String idCard;

在TeacherController中编辑controller:

@RestController
@RequestMapping("/api/teacher")
public class TeacherController {
    // 做数据效验 必须加上这个 @Valid注解 不然不显示结果
    @PostMapping
    public Integer insert(@RequestBody @Valid Product product){
        return 1;
    }
}

运行测试:

把拦截器给注释掉:运行测试一下:

如果想在控制台显示异常信息,可以debug一下看看是什么异常

异常配置:第一种方式:统一的处理

 @ExceptionHandler(BindException.class)
    public String processException(BindException e){
        BindingResult result = e.getBindingResult();
        StringBuilder sb=new StringBuilder();
        List<ObjectError> allError=result.getAllErrors();
        for (ObjectError error : allError) {
            sb.append(error.getDefaultMessage());
        }
        return sb.toString();
    }

测试运行:

第二种方式:使用自己的异常处理类 让异常信息返回json类型:

 @ExceptionHandler(Exception.class)
    public Object error( Exception e){
        int code=666;
        if(e instanceof BizException){
            BizException biz= (BizException) e;
            code=biz.getCode();
        }
        // 使用自己的异常处理
        if(e instanceof MethodArgumentNotValidException){
            StringBuilder sb = new StringBuilder();           
  List<ObjectError> allErrors = ( (MethodArgumentNotValidException) e).getBindingResult().getAllErrors();
            
            for(ObjectError error : allErrors){
                sb.append(error.getDefaultMessage());
            }
            return   ResponseDTO.error(888,sb.toString());
        }
        
        return   ResponseDTO.error(code,e.getMessage());
    }

测试访问:

正则表达式在线工具:正则表达式在线测试 | 菜鸟工具

max,min的用法

 @Min(value = 5,message = "数量最小为5")
    @Max(value = 100,message = "数量最大为100")
    private Integer qty;

测试:

邮箱验证: 必须结合非空约束

  @Email
    @NotEmpty
    private String email;

​测试

 身份证:正则表达式验证

@Pattern(regexp = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)", message = "身份号不合法请输入18位数字")
    private String idCard;

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

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

相关文章

学无止境·MySQL②

三道小题 图一1、创建数据库Market2、创建数据表customers,在c_num字段上添加主键约束和自增约束&#xff0c;在c_birth字段上添加非空约束。3、将c_contact字段插入到c_birth字段后面4、将c_name数据类型改为varchar(70)5、将c_contact 字段改名为c_phone6、增加c_gender字段&…

机器学习笔记:随机森林

1 集成学习 集成学习通过构建多个学习器采用加权的方式来完成学习任务一般来讲&#xff0c;多个学习器同属于一种模型&#xff0c;比如决策树&#xff0c;线性模型&#xff0c;而不会交叉用多种模型为了保证集成学习的有效性&#xff0c;多个弱分类器之间应该满足两个条件 准确…

【IMX6ULL驱动开发学习】19.mmap内存映射

mmap将一个文件或者其它对象映射进内存&#xff0c;使得应用层可以直接读取到驱动层的数据&#xff0c;无需通过copy_to_user函数 可以用于像LCD这样的外设&#xff0c; 需要读写大量数据的 一、应用层 mmap用法&#xff1a; 用open系统调用打开文件, 并返回描述符fd.用mma…

Unity 获取Animation中的所有Clip

获取Animation中的所有Clip List<string> clips new List<string>();foreach (AnimationState item in animation){var clipName item.name;clips.Add(clipName);}

msvcp100.dll丢失怎样修复(一键修复方法)

msvcp100.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual Studio 2010的一部分。这个文件主要包含了C的标准库函数&#xff0c;可以被应用程序调用以完成特定的功能。当系统中缺少或损坏了msvcp100.dll文件时&#xff0c;就会出现“msvcp100.dll丢失”的错误提示。 …

【C语言实战】小伙子,你真的掌握数组了吗?--- 三子棋

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;课设 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1f…

第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)

注&#xff1a;笔记截图均来自王卓数据结构教学视频 线性表的定义和特点 线性表是具有相同特性的数据元素的一个有限序列 同一线性表中的元素必定具有相同特性&#xff0c;数据元素间的关系是线性关系。 线性表的逻辑特征 稀疏多项式的运算 顺序存储结构存在的问题 1、存…

eNSP-MSTP多实例生成树

MSTP多实例生成树 文章目录 MSTP多实例生成树一、拓扑结构二、基本配置三、测试验证四、知识点详解 一、拓扑结构 二、基本配置 SW1: #创建vlan <Huawei>sys [Huawei]sys sw1 [sw1]un in en [sw1]vlan batch 2 to 20 #将接口划入vlan [sw1]port-group group-member Gig…

linux常用的命令

一.操作目录命令 1.1 ls 命令 语法&#xff1a; ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

MQTT emqx.conf

MQTT download_spencer_tseng的博客-CSDN博客 MQTT emqx-5.1.1-windows-amd64_spencer_tseng的博客-CSDN博客 c:/emqx-5.1.1-el8-amd64/etc/emqx.conf

第 108 场LeetCode双周赛

A 最长交替子序列 暴力枚举 class Solution { public:int alternatingSubarray(vector<int> &nums) {int n nums.size();for (int len n; len > 1; len--) {for (int i 0; i len - 1 < n; i) {int j i 1;for (; j < i len; j)if (nums[j] - nums[j …

mysql一条更新语句是如何被执行的——带你了解mysql更新语句执行内部顺序

文章目录 写在前面一、缓冲池 Buffer Poll二、Redo log1、磁盘寻址的过程2、redo log特点 三、Undo log四、更新过程五、InnoDB总体架构1、内存结构&#xff08;1&#xff09;Buffer Pool&#xff08;2&#xff09;预读机制&#xff08;3&#xff09;LRU算法&#xff08;4&…

安装Ceph集群

安装Ceph集群 环境准备 CentOS 7.6 主机名IPRoleadmin192.168.182.128adminnode1192.168.182.129mon/mgr/osdnode2192.168.182.130osdnode3192.168.182.131osdclient192.168.182.132 所有节点修改主机名相互解析三台node节点添加大小5G以上硬盘关闭所有节点防火墙与SeLinux所…

机器学习 day25(softmax在神经网络模型上的应用,提高数据精度的方法)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

【力扣算法07】之 2.两数相加 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析 完结 问题描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同…

RabbitMQ常用工作模式+整合springboot

目录 1.MQ的相关概念 1.1 什么是MQ消息中间件 1.2 为什么使用MQ (1) 应用解耦 (2) 异步提速 (3)削峰填谷 1.3 使用MQ的劣势 1.4 常见的MQ组件​​​​​​​ 2. RabbitMQ的概述 2.1 RabbitMQ的概念 2.2 RabbitMQ的原理 2.3 安装RabbitMQ 3. RabbitMQ 的工作模式…

Swift与OC的混编

一些场面话 在一位前辈的博客里看到了关于iOS开发的各种语言的混编&#xff0c;浅浅学习一下怎么使用。不得不说语言混编的开发者是真的&#x1f42e;&#x1f37a; Swift中用OC混编 新建一个Swift文件 创建一个OC的类 选择language为OC 继续往下走&#xff0c;会跳出这个界…

学无止境·MySQL⑤(存储函数、存储过程)

存储函数和存储过程试题 试题一1、创建一个可以统计表格内记录条数的存储函数 &#xff0c;函数名为count_sch()2、创建一个存储过程avg_sai&#xff0c;有3个参数&#xff0c;分别是deptno&#xff0c;job&#xff0c;接收平均工资&#xff0c;功能查询emp表dept为30&#xff…

C/C++用socket实现简单的TCP文件传输

C/C:用socket实现简单的TCP文件传输 网络中进程之间如何进行通信socket是什么socket的基本操作socket()函数bind()函数listen()、connect()函数accept()函数recv()/send()函数close()函数 TCP的“三次握手”“三次握手”的作用 TCP的“四次挥手”四次挥手的一些注意事项 代码实…

【附3.7安装包】python安装包下载及安装(超详细)

python3.7链接&#xff1a;https://pan.baidu.com/s/1Ett3XBMjWhkVOxkOU8NRqw?pwdqz3l 提取码&#xff1a;qz3l 今日资源&#xff1a;Python 适用系统&#xff1a;WINDOWS ​ Python 3.7.0 软件介绍&#xff1a; Python是一款通用型的计算机程序设计语言&#xff0c;Pytho…