【2023】Spring Validation中@NotNull注解、@NotBlank注解介绍以及使用

【2023】Spring Validation中@NotNull注解、@NotBlank注解介绍以及使用

  • 前言
  • 一、简介
    • `spring-validation`框架的常用注解
  • 二、代码实现
    • 添加依赖
    • 1、实体举例
    • 2、Controller层:
    • 3、统一异常处理
    • 4、结果返回
        • 验证通过返回
        • 验证失败返回

前言

平常我们在编写代码的时候总需要很多if判空,防止出现很多空指针问题。如:

if(name!=null){return "账号不能为空,请重新输入";
}
else if(password!=null){return "密码不能为空,请重新输入";
}

这样就会显得特别low,而且极不美观,而使用@NotNull 注解就可以通过注解直接实现验证。

一、简介

而spring给我们提供的 @NotNull ,@NotEmpty 等注解以实现对于接口参数的自动验证。

它这个实现主要是基于JSR 303 (JSR(Java Specification Request)是指由Java社区中的一个或多个成员提交的一项Java技术规范请求)的规范
JSR 303 的主要目标是为开发者提供一种在应用程序中进行数据验证的通用机制,而无需编写大量的验证代码。它定义了一组用于验证 Java 对象的注解和 API,可以用于验证对象的属性、方法参数和返回值等。

  • 注解:JSR 303 定义了一组用于验证的注解,如 @NotNull@Size@Pattern@Min、@Max 等。通过在 Java 对象的属性上添加这些注解,可以指定验证的条件和约束。
  • 常见的使用 JSR 303 的框架包括 Hibernate ValidatorSpring Validation 等。

早期的 Spring Web 基于 Hibernate Validator 实现了这些校验规范。在后期,Spring 将这部分校验独立成为了一个模块spring-validation,需要额外引入依赖实现相关注解校验。

spring-validation框架的常用注解

注解说明
@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(value)被注释的元素必须符合指定的正则表达式

注意:

  • 下面的注解都可以使用message 属性做异常错误返回的。 如: @NotNull(message = "name不能为空")

  • 在进行请求参数的验证时,需要在controller方法的需要验证的参数前面加上@Valid或者@Validated注解,否则Form中的验证注解不起作用。

  • 如果是内层对象需要验证的话,需要在里面对象前也加上@valid,这样,无论嵌套多少,都可以验证(包括对象泛型)。

@Valid与@Validated的区别

  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
  • @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,并且@Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制

二、代码实现

添加依赖

springboot 2.3.0 以前可以直接使用,而在2.3.0之后的版本不会自动引入jar包,所以要添加以下maven

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

1、实体举例

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.Date;@Data
public class User {@NotBlank(message = "姓名不能为空")private String name;@Max(value = 30,message = "姓名不能超过30岁")private Integer age;private Integer password;private String sex;@Past(message = "只能是过去的时间!")@DateTimeFormat(pattern = "yyyy-MM-dd")private Date date;@Email(message = "邮箱格式错误")private String email;/**如果引用了其他的对象要想其他的对象的生效,需要在引用时加上注解*/@Validprivate School school;
}

2、Controller层:

import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;/*** @author zhengfuping* @version 1.0* @description: TODO 测试 validation*/
@RestController
@RequestMapping("/test")
public class TestController {/*** @Param * @param u 实例对象* @param result validation提供的异常处理类* @return * @return Object*/@PostMapping("/save_user")@ResponseBodypublic Object saveUser(@Valid @RequestBody User u , BindingResult result) {
//        判断是否有异常,进行返回if (result.hasErrors()){FieldError fieldError = result.getFieldError();System.out.println(fieldError);return fieldError;}
//          没有异常打印日志返回System.out.println(u);return u;}
}

3、统一异常处理

如果不想每个Controller层的方法里面都要写一个判断方法,可以定义一个全局异常类进行统一处理

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Objects;/*** @author zhengfuping* @version 1.0* @description: TODO统一处理实体字段验证错误返回*/
@ControllerAdvice
@Slf4j
public class ControllerException {@ResponseBody@ExceptionHandler(MethodArgumentNotValidException.class)public Object handleValidException(MethodArgumentNotValidException e){log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
//            正常开发会有统一返回对象
//         return Result.error(500, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());return e.getBindingResult().getFieldError().getDefaultMessage();}
}

添加统一异常处理后Controller代码则可以简化为(为了区分重新写了一个)

    @PostMapping("/save_user2")@ResponseBodypublic Object saveUser2(@Valid @RequestBody User u) {System.out.println(u);return "验证通过";}

4、结果返回

验证通过返回

在这里插入图片描述

验证失败返回

在这里插入图片描述

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

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

相关文章

SSM - Springboot - MyBatis-Plus 全栈体系(二)

第一章 Maven 三、Maven 核心功能依赖和构建管理 1. 依赖管理和配置 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程…

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上&#xff0c;计算两点之间的直线距离通常使用地理坐标系&#xff08;例如WGS84&#xff09;。计算两地直线距离的公式是根据经纬度之间的大圆距离&#xff08;Great Circle Distanc…

【力扣】55、跳跃游戏

var canJump function(nums){let cover 0;for(let i0;i<nums.length;i){if(i<cover){cover Math.max(nums[i]i,cover);if(cover >nums.length-1){return true;}}}}

手把手教你Jenkins整合Jmeter实现自动化接口测试

01、在机器上安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改jmeter.properties 中 jmeter.save.saveservice.output_format值为xml。 编写接口测试脚本&#xff1a; …

CTFhub-文件上传-无验证

怎样判断一个网站是 php asp jsp 网站 首先&#xff0c;上传用哥斯拉生成 .php 文件 然后&#xff0c;用蚁剑测试连接 找到 flag_1043521020.php 文件&#xff0c;进去&#xff0c;即可发现 flag ctfhub{ee09842c786c113fb76c5542}

GPT-3在化学中进行低数据发现是否足够?

今天介绍一份洛桑联邦理工学院进行的工作&#xff0c;这份工作被发表在化学期刊预印本网站上。 对于这份工作&#xff0c;有兴趣的朋友可以通过我们的国内ChatGPT镜像站进行测试使用&#xff0c;我们的站点并没有针对特定任务进行建设&#xff0c;是通用性质的。 化学领域进行…

Acwing798.差分矩阵

前缀和与差分 图文并茂 超详细整理&#xff08;全网最通俗易懂&#xff09;_前缀和差分_林小鹿的博客-CSDN博客 代码展示&#xff1a; #include<iostream> #include<cstdio> using namespace std; const int N 1e3 10; int a[N][N], b[N][N]; void insert(int x…

V4L2 摄像头应用编程

目录 V4L2 简介V4L2 摄像头应用程序打开摄像头查询设备的属性/能力/功能设置帧格式、帧率申请帧缓冲、内存映射入队开启视频采集 ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头&#xff0c;包括正点原子的ov5640&#xff08;500W 像素&#xff09;、 ov2640&#xff08;20…

2023-08-27 LeetCode每日一题(合并区间)

2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#…

【HSPCIE仿真】输入网表文件(3)子电路描述语句

子电路描述语句 1. 子电路的定义定义子电路的基本语法子电路终止语句子电路的调用语句全局节点(.gloab)示例 2. 基于子电路执行多次分析 HSPICE 允许用户在程序执行过程中调用由各种 HSPICE 元件和器件构成的子电路&#xff0c;即电路结构的层次化描述。 子电路是以 .SUBCKT 或…

git clone 报SSL证书问题

git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码

3418. 杨辉三角形

目录 题目描述&#xff1a; 解题思路&#xff1a; 备注知识点&#xff1a; 代码详解&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a; 所求为第一次出现的数字 因为杨辉三角沿中间轴对称 故只需考虑最左边的数字 因为杨辉三角对于每一列从小到大递增 对于每一行…

动态不确定性的动态S过程(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

mysql数据表Table is marked as crashed and should be repaired 的解决办法

错误原因 网上查了一下&#xff0c;错误的产生原因&#xff0c;有网友说是频繁查询和更新XXXX表造成的索引错误&#xff0c;还有说法是Mysql数据库因某种原因而受到了损坏。 【如&#xff1a;数据库服务器突发性断电&#xff0c;在数据表提供服务时对表的源文件进行某种操作都…

学习笔记:Pytorch利用MNIST数据集训练生成对抗网络(GAN)

2023.8.27 在进行深度学习的进阶的时候&#xff0c;我发了生成对抗网络是一个很神奇的东西&#xff0c;为什么它可以“将一堆随机噪声经过生成器变成一张图片”&#xff0c;特此记录一下学习心得。 一、生成对抗网络百科 2014年&#xff0c;还在蒙特利尔读博士的Ian Goodfello…

统信OS国产操作系统身份证读卡器社保卡读卡web网页开发使用操作流程

用于DONSEE系列身份证阅读器谷歌Chrome火狐Firefox插件&#xff0c;支持的型号有&#xff1a;EST-100、EST-100GS、EST-100G、EST-100U、EST-200G、EST-J13X等。 本方案无缝支持最新版本谷歌Chrome火狐Firefox等网页浏览器&#xff0c;支持H5、Vue、React、Node.js、Electron、…

区块链金融项目怎么做?

区块链技术的兴起引发了金融领域的变革&#xff0c;为金融行业带来了前所未有的机遇与挑战。在这个快速发展的领域中&#xff0c;如何在区块链金融领域做出卓越的表现&#xff1f;本文将从专业性和思考深度两个方面&#xff0c;探讨区块链金融的发展路径&#xff0c;并为读者提…

低代码/无代码平台:加速应用开发的工具

在数字化时代&#xff0c;软件应用已经成为企业和组织不可或缺的一部分。然而&#xff0c;传统的应用开发过程往往需要大量的时间、资源和专业知识。为了解决这个问题&#xff0c;低代码/无代码平台应运而生&#xff0c;它们为开发者提供了一种更快速、更简便的应用开发方式。本…

lab11 net

background 在开始写代码之前&#xff0c;回顾一下xv6book的第五章会有帮助你将使用E1000去处理网络通信 E1000会和qemu模拟的lan通信在qemu模拟的lan中 xv6的地址是10.0.2.15qemu模拟的计算机的地址是10.0.2.2 qemu会将所有的网络包都记录在packets.pcap中文件kernel/e1000.…

【LeetCode-中等题】148. 排序链表

文章目录 题目方法一&#xff1a;集合排序&#xff08;核心是内部的排序&#xff09;方法二&#xff1a; 优先队列&#xff08;核心也是内部的排序&#xff09;方法三&#xff1a;归并排序&#xff08;带递归&#xff09; 从上往下方法四&#xff1a;归并排序&#xff08;省去递…