SpringBoot整合Validation进行参数校验

目录
依赖
在controller中校验接收到的参数
Validation常用注解
异常处理
多级嵌套校验
分组校验

spring、lombok提供了一些参数校验的注解,比如@Nullable、@NonNull ,但比较鸡肋,常用Validation的注解来校验controller接收到的参数。

以springboot整合validation为例。

依赖
创建时勾选 I/O -> Validation,也可以手动添加依赖

1
2
3
4
5

实质是使用hibernate的遗产 hibernate-validator,也可以直接引入下面的依赖

1
2
3
4
5

在controller中校验接收到的参数
@Controller
@Validated //类上加spring的注解 @Validated
public class TestController {

@RequestMapping(“/handler1”)
@ResponseBody
// 如果要校验的参数是jdk自带的类型(包括数组、集合),可直接在参数前加注解
public User handler1(@NotNull String name, String tel, @Email String email, @NotEmpty String[] hoby) {
return new User(1, name, tel, email, hoby);
}

@RequestMapping(“/handler2”)
@ResponseBody
// 如果要校验的参数是实体类,在实体类参数前加@Validated,校验的注解加在实体类的成员变量上
public User handler2(@Validated User user) {
return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Getter
@Setter
@ToString
@AllArgsConstructor
public class User implements Serializable {

private Integer id;

@NotNull
private String name;

private String tel;

@Email
private String email;

@NotEmpty
private String[] hoby;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Validation常用注解
@NotNull //常用于校验包装类型、数组,不能为null
@NotEmpty //校验包装类型、String、数组、集合,不能为null。如果是集合、数组,里面要有元素;如果是字符串,不能为空串,但可以是空格串
@NotBlank //校验String,不能为null,且不能为空串、空格串

//如果是String,不管前端有没有传该字段、该字段是否有值,后端该字段一定不为null,要用@NotEmpty|@NotBlank不能用@NotNull
//如果是数组(复选框),后端会先检验数组中是否有元素,有才new一个数组来接收,可以用@NotNull来校验
//总结:包装类用NotNull,String用@NotEmpty|@NotBlank,数组用@NotNull|@NotEmpty

@Max(100) //校验数值型,参数指定允许的最大值(long型),value=100,此处简写了
@Min(1)
@Range(min = 1, max = 100) //校验数值型的范围,相当于@Min+@Max

@DecimalMax(@DecimalMax(value = “100.00”, inclusive = false) //校验定点型,可指定String类型的最大值,是否包含该值(默认true)
@DecimalMin(“0.0”)

@Digits(integer = 4, fraction = 2) //校验数值型,限定整数部分最多4位,小数部分最多2位

@Future //校验Date,必须大于当前时间,即必须是未来
@Past

@Email //必须是email格式
@URL //必须是url格式

@Length(min = 5, max = 10) //校验字符串、数组长度(leng),【5,10】
@Size(min = 5, max = 10) //校验集合的元素个数(size),【5,10】

@Pattern(regexp = “\d+”, message = “只能输入1个或多个阿拉伯数字”) //使用指定的正则表达式进行校验,\d+,第一个\是转义用的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
以上注解均可指定message,如果不指定会使用默认的message。建议都指定message,返回给用户的提示更友好。

异常处理
不满足校验条件时会直接抛出 ConstraintViolationException 异常,可在全局异常处理中捕获处理,获取message返回给前端

/*
* 全局异常处理
/
@ControllerAdvice
public class GlobalExceptionHandler {

//……

@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Map

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

多级嵌套校验
@Controller
@Validated
public class TestController {

@RequestMapping(“/handler”)
@ResponseBody
//要校验的参数是实体类
public User handler( @Validated User user) {
//…..

return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
@Getter
@Setter
@ToString
public class User implements Serializable {

//……

@Valid //加@Valid
private GoodsCar goodsCar;

@Valid //加@Valid
private List

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如果要检验的参数是实体类,而这个实体类中又嵌套了实体类,如果要校验内嵌的实体类中的成员变量,还需要在内嵌的实体类成员上加@Valid。

spring的 @Validated 不支持多级嵌套校验,Validation的 @Valid 则支持。

分组校验
多个方法都要使用某个实体类作为参数,但对这个实体类的成员变量的校验规则不同,这时可以使用分组校验。

/*
* 定义一个类|接口作为一个分组,不一定要继承validation的Default
* 也可以直接使用已存在的类|接口作为分组
/
public interface OperateById {

public interface FindByUser extends Default {

}
1
2
3
4
5
6
7
8
9
10
11
12
@Getter
@Setter
@ToString
public class User implements Serializable {

//使用groups指定该字段所属的分组,属于多个组时写成数组形式
@NotNull(groups = {OperateById.class, FindByUser.class})
private Integer id;

@NotBlank(groups = FindByUser.class)
private String name;

//如果缺省groups属性,默认为Default.class,属于默认分组
@Pattern(regexp = “[0-9]{11}”)
private String tel;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
@Validated
public class TestController {

@RequestMapping(“/handler”)
@ResponseBody
//校验时指定所使用的校验规则(分组),可简写为 @Validated(FindByUser.class)。缺省value属性时默认为Default.class,使用默认分组
public User handler( @Validated(value = FindByUser.class) User user) {
//…..

return user;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
校验时会使用指定分组中的校验规则进行校验。示例中

OperateById分组只校验id字段是否满足@NotNull
默认分组只校验tel字段是否为11位的阿拉伯数字
FindByUser分组会校验id字段是否满足@NotNull、name字段是否满足@NotBlank,因为FindByUser继承了Default,所以也会校验默认分组中的字段
自定义的分组要不要继承Default,视需求而定。
————————————————
版权声明:本文为CSDN博主「chy1984」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chy_18883701161/article/details/109848241

Original: https://www.cnblogs.com/suizhikuo/p/16332214.html
Author: 勤学如春起之苗
Title: SpringBoot整合Validation进行参数校验

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541292/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Fiddler如何设置接口并发

    Fiddler — 并发 可以对接口测试是否做了限制,比如我进行抽奖,我将 抽奖的接口进行并发,如果开发没有做限制同一秒内我进入10个请求都被响 应,那恭喜了你有了是个奖品 1….

    Java 2023年6月6日
    079
  • Docker安装Portainer

    Docker安装Portainer Docker介绍 Docker是一个开源的容器引擎,完全使用沙箱机制,相互之间不会有任何接口,并且容器性能开销低,让开发者可以打包应用或者依赖包…

    Java 2023年6月15日
    074
  • Spring Security 案例实现和执行流程剖析

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin Spring Security Spring Securi…

    Java 2023年5月30日
    090
  • 编写 java 程序,为家用电脑 ipv6 自动更新 goddy dns 记录(ddns)

    家里放了一台旧 acer 笔记本电脑,外挂几个硬盘盒,插上几个硬盘,组成硬盘盒。 因笔记本电脑的耗电较小,硬盘盒有自动休眠省电模式,所以长期开机。此笔记本电脑,使用家庭的移动宽带,…

    Java 2023年6月9日
    0106
  • Java编译到执行的过程

    Java编译到执行的过程 执行过程: 编译→加载→解释→执行 运行过程 .Java→.class→装载到JVM→.class→可执行指令→调用系统硬件执行最终指令 详细过程 编译过…

    Java 2023年6月8日
    0164
  • Spring5 源码解析 IOC默认标签解析上半部分之解析BeanDefinition

    前言 前两篇文章,Spring5源码解析_整体架构分析、IOC容器的基本实现大家应该对Spring的IOC容器有了初步的了解,接下来我们研究Spring标签的解析,Spring标签…

    Java 2023年6月7日
    068
  • zookeeper简介及基操

    cpp;gutter:true; zk的安装: 1. 下载zk.tar.gz安装包,并解压至/usr/local/devInstall 2. 在zk的目录下新建文件夹data 3….

    Java 2023年6月8日
    072
  • ajax学习总结

    ajax 总结 全局刷新与局部刷新 全局刷新 由浏览器向服务端发送请求,服务端处理请求并返回响应数据,全局刷新就是会将原来浏览器内存中的页面完全覆盖掉。 例如:index.html…

    Java 2023年6月8日
    084
  • SpringMVC工作原理源码分析

    SpringMVC工作原理源码分析 首先、当请求进入Tomcat时、在web.xml查找对应的Servlet类、找到DispatcherServlet类并且匹配路径 /、现在创建D…

    Java 2023年6月16日
    079
  • Java 8 Lambda表达式介绍(一)

    开局一张图,内容全靠摘录… 一:概述 什么是lambda表达式? lambda的语法规则 为什么需要引入lambda表达式? 什么是lambda表达式? 名词解释:la…

    Java 2023年5月29日
    072
  • [javaweb]监听器统计网页在线人数

    监听器 1.配置监听器 package com.javaweb.controller; import javax.servlet.ServletContext; import ja…

    Java 2023年6月6日
    089
  • IDEA的超好体验用法

    日常使用Java开发都使用Idea,最近发现一个体验非常好的用法,即开启Presentation Mode 开启 Presentation Mode 入口 View->App…

    Java 2023年6月9日
    0108
  • Linux部署多个Tomcat配置修改

    多Tomcat部署配置修改 修改配置文件: /opt/tomcat8.5/nps-tomcat8865/conf/server.xml ,修改以下三个配置端口为未被占用端口 &lt…

    Java 2023年6月5日
    074
  • SpringBoot工程通过jdbc连接Hive

    首先确定当前hive的版本 例如:我目前的版本就是hive-common-1.1.0-cdh5.16.2.jar 注意:引入的Hive-jdbc依赖需与Hive版本保持一致。 依次…

    Java 2023年6月5日
    0130
  • Skywalking-02:如何写一个Skywalking trace插件

    如何写一个Skywalking trace插件 javaagent 原理 美团技术团队-Java 动态调试技术原理及实践 类图 实现 ConsumeMessageConcurren…

    Java 2023年6月5日
    093
  • SSM整合

    正常创建一个maven项目,环境是jDK1.8及以上,maven3.8及以上 无论SSM项目、SpringBoot项目还是SpringCloud项目第一件事就是添加相关的依赖。这里…

    Java 2023年6月13日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球