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

news2024/11/20 0:25:39

【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;
    /**如果引用了其他的对象要想其他的对象的生效,需要在引用时加上注解*/
    @Valid
    private 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public Object saveUser2(@Valid @RequestBody User u) {
        System.out.println(u);
        return "验证通过";
    }

4、结果返回

验证通过返回

在这里插入图片描述

验证失败返回

在这里插入图片描述

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

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

相关文章

【docker】运行registry

registry简介 Docker registry是docker镜像仓库的服务,用于存储和分发docker镜像。 Docker registry主要特点和功能: 存储docker镜像:提供持久化存储docker镜像的功能,存储镜像的各个layer。 分发镜像:拉取和推送镜像的去中心化存储和分发服务。 支持版本管理:给镜像打标签…

编码基础一:侵入式链表

一、简介概述 1、普通链表数据结构 每个节点的next指针指向下一个节点的首地址。这样会有如下的限制&#xff1a; 一条链表上的所有节点的数据类型需要完全一致。对某条链表的操作如插入&#xff0c;删除等只能对这种类型的链表进行操作&#xff0c;如果链表的类型换了&#…

网约车平台如何开发?需要多少钱?

随着共享经济的兴起&#xff0c;网约车行业迅速发展&#xff0c;并成为人们生活中不可或缺的一部分。为了满足市场需求和提供更好的服务&#xff0c;开发一款高质量的网约车源码平台至关重要。本文将深入探讨网约车源码平台的开发方案&#xff0c;从技术架构、安全性和用户体验…

Python数据分析实战-DataFrame按照某列指定的顺序排序(附源码和实现效果)

实现功能 dataframe按照某列指定的顺序排序 实现代码 import pandas as pd# 创建一个示例 DataFrame df pd.DataFrame({name: [Alice, Bob, Charlie, David, Eva],age: [25, 30, 35, 40, 45],gender: [F, M, M, M, F]})# 按照指定顺序排序 sort_order [Eva, David, Charli…

echarts图表共用一个 timeline(A表 timeline 同时控制B表)

先看效果: 再看代码(部分): let barOption = {baseOption: {height: 350,timeline: {x: center,//时间轴X轴方向位置设置y: bottom,//时间轴Y轴方向位置设置width: 80%,//宽度height: 50,//高度show:true,axisType: category,autoPlay: true,playInterval: 1000,data: [Em…

好书分享| 战斗细胞之从进化上了解免疫系统和肠道

小编最近仔细阅读了一本书&#xff0c;书名是《战斗细胞&#xff1a;人体免疫系统奇妙之旅》&#xff08;海南出版社2022年10月出版的&#xff09;&#xff0c;该书是德国科学家菲利普德特玛&#xff08;Philipp Dettmer&#xff09;撰写的一本书&#xff0c;作者是一名信息设计…

ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)

1.分析框图&#xff1b; 2.比较捕获寄存器&#xff08;产生PWM方波&#xff09;&#xff1b; 工作原理&#xff1a; 1、系统提供一个时钟源209MHZ&#xff0c;需要通过分频器进行分频&#xff0c;设置分频器值为209分频&#xff1b; 2、当定时器启动之后&#xff0c;自动重载…

Pygame编程(3)draw模块

draw模块 函数实例 函数 pygame.draw.rect 画一个矩形rect(surface, color, rect) -> Rectrect(surface, color, rect, width0, border_radius0, border_top_left_radius-1,border_top_right_radius-1, border_bottom_left_radius-1, border_bottom_right_radius-1) -> …

非常简单!用Java实现一个简单的向量数据库雏形。

概述 向量数据库是用来解决高维向量数据管理和查询的问题。它能够有效地存储、索引和查询大规模高维度向量数据&#xff0c;并提供高性能和高效的相似度搜索。传统的关系型数据库或文档数据库在处理高维向量数据时可能会遇到诸多问题。比如在高维空间中&#xff0c;数据点之间…

网红景区游乐设备普乐蛙5d动感影院体验馆设备组成内容

一个5D7D动感影院体验馆的全套设备组成通常包括以下几个方面&#xff1a; 电影播放设备&#xff1a;包括主控制器、电影播放器、电影储存设备等&#xff0c;用于播放5D电影。 影院座椅&#xff1a;一般采用特殊设计的动感座椅&#xff0c;具备震动、摇晃、抖动等功能&#xff0…

Mainline Linux 和 U-Boot编译

By Toradex胡珊逢 Toradex 自从 Linux BSP v6 开始在使用 32位处理器的 Arm 模块如 iMX6、iMX6ULL、iMX7 上提供 mainline/upstream kernel &#xff0c;部分 64位处理器模块如 Verdin iMX8M Mini/Plus 也提供实验性支持。文章将以季度发布版本 Linux BSP V6.3.0 为例介绍如何下…

为什么选择新风机?

现如今&#xff0c;新风机已经是很多场地的熟客了&#xff0c;那大家可能疑惑为什么选择新风机呢&#xff1f;那就让我揭晓答案吧&#xff01;新风机有很多益处&#xff0c;让我大致简述一下吧。 改善室内空气质量&#xff1a;新风机能够引入新鲜的外界空气&#xff0c;并排除室…

lab7 thread

文章目录 Uthread: switching between threadstaskhints思路上下文的恢复和保存thread_createthread_schedule Using threads思路 Barrier Uthread: switching between threads 在这个练习中&#xff0c;你将为一个用户级别线程系统设计上下文切换机制&#xff0c;并实现它。 …

算法leetcode|73. 矩阵置零(rust重拳出击)

文章目录 73. 矩阵置零&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 73. 矩阵置零&#xff1a; 给定一个 m x n 的矩…

邮件营销:高效的节日宣传方式

每个国家都有当地的传统节日&#xff0c;像是我国刚过去的端午节&#xff0c;即将迎来的中秋节、国庆节。我们除了会进行一些传统习俗外&#xff0c;各路商家还会趁这个机会开启促销活动。 对于公司来讲&#xff0c;抓住每一次营销活动都可能会带来更高的营销额&#xff0c;或…

ATA-7000系列高压放大器——应用场景介绍

ATA-7000系列是一款理想的可放大交、直流信号的高压放大器。单端输出20kVp-p&#xff08;10kVp&#xff09;高压&#xff0c;可以驱动高压型负载。电压增益数控可调&#xff0c;一键保存常用设置&#xff0c;为您提供了方便简洁的操作选择。 图&#xff1a;ATA-7000系列高压放大…

2021年长安杯电子数据取证比赛

VC挂载 一&二检材 长安杯-1 检材一 请计算检材一Apk的SHA256值 3fece1e93be4f422c8446b77b6863eb6a39f19d8fa71ff0250aac10f8bdde73a 长安杯-2 该APK的应用包名为 plus.H5B8E45D3 长安杯-3 APPID 该APK程序在封装服务商的应用唯一标识&#xff08;APPID&#xff09;为…

设计模式之抽象工厂

文章目录 一、介绍二、基本组件三、演示案例1. 定义抽象工厂2. 定义抽象产品3. 定义具体工厂4. 定义具体产品5. 代码演示6. 代码改造 四、总结 一、介绍 抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。用于解决比工厂方法设计模式更加复杂的问题。 复杂到哪里了…

U盘怎么加密?U盘加密方法有哪些?

U盘是我们生活和工作中最常用的移动储存设备&#xff0c;经常被用来存放各种重要数据&#xff0c;为了保证数据的安全&#xff0c;我们需要加密U盘。那么&#xff0c;U盘加密方法有哪些呢&#xff1f; U盘加密普通方法 如果你的U盘储存数据不多&#xff0c;并且对于加密的要求…

Orchestrator介绍三 命令行工具

Orchestrator-client orchestrator 支持两种方式通过命令行操作&#xff1a; 一种是 通过命令 orchestrator&#xff1a; 需要在服务器上安装 orchestrator&#xff0c;但是可以不作为服务启动。 需要配置orchestrator的文件&#xff0c;以便能够连接后端数据库 一种是通过…