当前位置: 首页 > news >正文

SpringBoot中使用(@NotEmpty、@NotBlank、@NotNull)注解校验实体类参数

SpringBoot中使用(@NotEmpty、@NotBlank、@NotNull)注解校验实体类参数

@NoNull、@NotEmpty等注解无效,以及嵌套对象属性验证无效问题

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

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

在这里插入图片描述

1、引入需要的依赖

<!--参数校验注解所需依赖 spring-boot2.3之后需要单独引入-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <!--这里版本一般和springboot一样-->
            <version>${spring-boot.version}</version>
        </dependency>

2、常用注解说明

在这里插入图片描述

3、@Valid与@Validated的区别

3.1、 注解使用的地方

@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

3.2、 分组

@Valid没有分组的功能
@Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。没有添加分组属性时,默认验证没有分组的验证属性。
实体类参数:

这里需要注意的是如果当前对象引用的有其他对象,如果想引用的对象的校验也生效,需要在引用的对象上加@Valid注解

public class Grade {
    private int id;
    @NotBlank(message = "名称不能为空" ,  groups = {InsertGroup.class})
    private String name;
    private int grade;
    private int classes;
    @Valid
    private User user;
}

Controller层代码

这里Controller层如果不加@Validated或者 @Valid 注解,即使实体类里加了校验的注解也不会生效,@RequestBody注解是指参数在请求的body体里

@RestController
public class TestController {
    @PostMapping("/getGrade")
    public Grade getGrade(@Validated(InsertGroup.class) @RequestBody Grade grade){
        return new Grade();
    }
}

@Valid与@Validated都是用来校验接收参数的。
 
@Valid是使用Hibernate validation的时候使用
 
@Validated是只用Spring Validator校验机制使用
 
说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现。
 
 
 
@Validated与@Valid区别:
 
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测\
 
 
 
注意:SpringBoot使用@Valid注解需要引入如下POM
 
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

自定义的分组接口

public interface InsertGroup {
}

这里分组是自定义的一个接口,接口里没有方法。
分组的意义在于不同的场景,同一个实体可能需要校验的规则不同,比如新建的时间,id可以为null,但是更新信息的时间id一定不可以为null。这时就可以用分组区分。
同时分组是可以继承的。

相关文章:

  • 两化融合贯标办理周期和好处是什么
  • 基于双碳背景和趋势讲述AcrelEMS企业微电网能效管理系统-Susie 周
  • PYQT5实现图片显示、通过滚轮缩放图片、通过鼠标拖动图片移动,搞懂所有细节
  • 利用MATLAB绘制箱线图—箱线图在高光谱图像处理中的应用
  • ERPS协议学习笔记
  • node.js基于微信小程序的校园失物招领系统毕业设计源码072343
  • 1.4 Elasticsearch索引的mappings映射
  • ams启动过程以及App的启动过程
  • Java毕业设计-新闻段子发布管理系统
  • maven依赖冲突导致tomcat启动失败
  • Mysql基础(四)——约束与表关系
  • 聚苯乙烯微球表面原位接枝含糖聚合物/pH响应性磁性聚苯乙烯基多孔微球制备方法
  • Curator使用手册
  • x86汇编_MUL/IMUL乘法指令_笔记52
  • CSP-J1 CSP-S1第1轮 初赛 如何拿到好成绩(60分及以上)
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • javascript数组去重/查找/插入/删除
  • Mac转Windows的拯救指南
  • Python十分钟制作属于你自己的个性logo
  • spring security oauth2 password授权模式
  • uva 10370 Above Average
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 前嗅ForeSpider中数据浏览界面介绍
  • elasticsearch-head插件安装
  • Python 之网络式编程
  • #if和#ifdef区别
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (五)网络优化与超参数选择--九五小庞
  • (转)ABI是什么
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Framework .NET Core与 .NET 的区别
  • .NET企业级应用架构设计系列之技术选型
  • .NET学习全景图
  • ?.的用法
  • @Conditional注解详解
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [Android]Android开发入门之HelloWorld
  • [C++] sqlite3_get_table 的使用
  • [CF226E]Noble Knight's Path
  • [Flutter]WindowsPlatform上运行遇到的问题总结
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [k8s系列]:kubernetes·概念入门
  • [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
  • [linux] GFLOPS和TFLOPS的换算
  • [NHibernate]条件查询Criteria Query
  • [nlp] grad norm先降后升再降
  • [NOIP2017 提高组] 列队 题解