我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot中参数校验的方法有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot中参数校验的方法有哪些

这篇文章给大家分享的是有关SpringBoot中参数校验的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、前言

在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验、非空校验等,基本上每个接口都需要进行校验。如果使用常规的 IF ELSE 进行校验,随着参数越来越多,校验逻辑的冗余度也越来越高,导致维护性变差。在 Java 中定义了一套基于注解的数据校验规范 Bean Validation ,通过一些简单的注解就能完成必要的逻辑校验,相对来说就方便了很多。而 Bean Validation 只是规范,并没有具体的实现,Hibernate 提供了具体的实现,也即 Hibernate Validator ,这个也是目前使用得比较多的验证器了。

二、注解介绍

validator 内置注解

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

Hibernate Validator 附加的 constraint

  • @Email 被注释的元素必须是电子邮箱地址

  • @Length 被注释的字符串的大小必须在指定的范围内

  • @NotEmpty 被注释的字符串的必须非空

  • @Range 被注释的元素必须在合适的范围内

  • @NotBlank 验证字符串非 null ,且长度必须大于0

注意

  • @NotNull 用于验证对象是否不为 null ,无法检测长度为0的字符串;

  • @NotEmpty 用于 String、Map 或者数组等集合类型不能为 null 且长度必须大于0;

  • @NotBlank 只能用于String,不能为 null ,且调用 trim() 后,长度必须大于0;

校验字符串是否为空,使用 @NotNull ,只有参数不传的时候才会检测到,传了空值(例如空字符串)仍然可以通过校验,因此应该使用 @NotBlank

三、添加依赖

SpringBoot 中 Bean Validation 已经集成在 starter-web 中,因此无需再添加依赖。但是本人实际测试发现,直接使用好像不行,因此添加了如下依赖:

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

四、创建用于校验的实体类

创建一个 validator 目录,在里面创建一个 UserDTO 类:

SpringBoot中参数校验的方法有哪些

本来想直接复用之前创建的 entity 类,但是后来想了下,entity 用于建立数据库的映射关系,字段跟数据表是一一对应的,而这里的 validator 是用于校验前端传过来的参数,字段跟前端传的参数是对应的,因此不能复用,需要单独写一个 validator 类。

顺便提一下,在 RestController 中使用自己定义的对象,需要有 setter、getter 之类的方法,或者使用 lombok 的 @Data 注解。如果不加的话会报错:

No converter found for return value of type: class validator.UserDTO

使用 getter、setter 方法如下:

public class UserDTO {private String username;private Integer age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}

使用 lombok 的 @Data 注解如下,代码与上面等效:

@Datapublic class UserDTO {private String username;private Integer age;}

五、写一个测试用的接口

添加一个 POST 接口,从请求体中获取参数,然后原封不动返回过去(主要是用来测试参数校验的,这里接口逻辑并不重要)

@PostMapping("validateUser")public UserDTO userValidate(@RequestBody UserDTO userDTO) {    return userDTO;}

六、在实体类中添加注解

给需要校验的参数添加注解:

@Datapublic class UserDTO {    @NotBlank(message = "用户名不能为空")    private String username;    @NotBlank(message = "手机号不能为空")    private String mobile;    @NotNull(message = "性别不能为空")    private Integer sex;    @NotNull(message = "年龄不能为空")    private Integer age;    @NotBlank(message = "邮箱不能为空")    @Email(message = "邮箱格式错误")    private String email;}

七、在 controller 方法中添加 Validated 注解

然后需要在 controller 方法体添加 @Validated ,不加 @Validated 校验会不起作用。

SpringBoot中参数校验的方法有哪些

用下面的数据测试一下:

{    "username": "",    "mobile": "2333",    "sex": 0,    "age": 0,    "email": "233@dby.com"}

可以看到校验是成功了,但是后台抛了一个异常:

Validation failed for argument [0] in public validator.UserDTO com.hhlnyfz.hhlnyfz.HelloController.userValidate(validator.UserDTO): [Field error in object ‘userDTO' on field ‘username': rejected value []; codes [NotBlank.userDTO.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userDTO.username,username]; arguments []; default message [username]]; default message [用户名不能为空]] ]

然后返回参数并不理想,前端也并不容易处理返回参数:

SpringBoot中参数校验的方法有哪些

八、添加全局异常处理

上面这种情况需要添加一下全局异常处理,这样比较规范。创建一个 GlobalExceptionHandler 类,在类的上面添加 @RestControllerAdvice 注解,然后添加如下代码:

@RestControllerAdvicepublic class GlobalExceptionHandler {    // 捕获 MethodArgumentNotValidException 异常    @ExceptionHandler(value = MethodArgumentNotValidException.class)    public HashMap<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {        HashMap<String, Object> map = new HashMap<>();        map.put("code", 400);        map.put("msg", e.getMessage());        map.put("url", request.getRequestURL());        return map;    }    // 其他异常处理方法}

这边 @ExceptionHandler 注解中的 MethodArgumentNotValidException.class 用于捕获请求参数异常。如果是 Exception.class 表示捕获全部异常。不要用一个方法处理所有的异常,而是一个方法处理一种异常。如果需要处理其他异常,可以在下面添加方法。

还是用刚才的测试用例,这次异常被捕获到了,返回的内容如下:

SpringBoot中参数校验的方法有哪些

可以看到 e.getMessage() 把整个错误堆栈信息全部打印出来了,但我们只需要把最后的 default message 返回给前端就行,因此改用 e.getBindingResult().getFieldError().getDefaultMessage() ,然后 IDE 给了提示:

Method invocation ‘getDefaultMessage' may produce ‘NullPointerException'

也就是说 e.getBindingResult().getFieldError() 可能会是一个空指针 null ,于是按照 IDE 的提示用 Objects.requireNonNull 包裹一下,最终代码如下:

@RestControllerAdvicepublic class GlobalExceptionHandler {    // 捕获 MethodArgumentNotValidException 异常    @ExceptionHandler(value = MethodArgumentNotValidException.class)    public HashMap<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {        HashMap<String, Object> map = new HashMap<>();        map.put("code", 400);        map.put("msg", Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());        map.put("url", request.getRequestURL());        return map;    }    // 其他异常处理方法}

响应内容如下:

SpringBoot中参数校验的方法有哪些

当然这边还是有不规范的地方,没有用统一响应体进行返回,后面会介绍如何封装统一响应体。

九、分组校验

@Valid@Validated 两个注解都可以实现校验,前面的功能用 @Valid 也是可以的,但是 @Validated 功能更强大,可以实现分组校验。什么是分组校验,分组校验实际上实现了实体类的复用,有时候并不希望对所有的参数都进行校验,例如下面这个情况:

@Datapublic class Route {@NotNull(message = "始发地省id不能为空")private Integer startProvinceId;@NotNull(message = "目的地省id不能为空")private Integer endProvinceId;@NotBlank(message = "详细地址不能为空")private String address;}

假如在一个接口中只希望校验 startProvinceIdaddress ,而在另一个接口中只希望校验 endProvinceIdaddress ,这个时候就可以用分组校验。可以定义一个接口:

public interface ValidateGroup {interface RouteValidStart {}interface RouteValidEnd {}}

然后在实体类中添加分组:

@Datapublic class Route {@NotNull(groups = {RouteValidStart.class}, message = "始发地省id不能为空")private Integer startProvinceId;@NotNull(groups = {RouteValidEnd.class}, message = "目的地省id不能为空")private Integer endProvinceId;@NotBlank(groups = {RouteValidStart.class, RouteValidEnd.class}, message = "详细地址不能为空")private String address;}

然后在校验的时候只需要把分组传入 @Validate 就可以实现指定参数的校验:

@RequestMapping("addRoute")public ServerResponse addRoute(@RequestBody @Validated({RouteValidStart.class}) Route route) {// ...return ServerResponse.success();}

十、单个参数校验

在参数前面加上注解即可:

@PostMapping("/get")public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用户ID不能为空") String userId){    return new ReturnVO().success();}

然后在 Controller 类上面增加 @Validated 注解,注意不是增加在参数前面。

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

感谢各位的阅读!关于“SpringBoot中参数校验的方法有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot中参数校验的方法有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot中参数校验的方法有哪些

这篇文章给大家分享的是有关SpringBoot中参数校验的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验、非空校验等,基本上每个
2023-06-15

SpringBoot集成Validation参数校验的方法是什么

这篇“SpringBoot集成Validation参数校验的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri
2023-06-26

SpringBoot参数验证的技巧有哪些

这篇文章主要介绍“SpringBoot参数验证的技巧有哪些”,在日常操作中,相信很多人在SpringBoot参数验证的技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot参数验证的技巧
2023-07-05

关于SpringBoot中controller参数校验的使用

本文主要介绍了关于SpringBoot中controller参数校验的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-15

Go高效率开发Web参数校验的方式有哪些

本篇内容介绍了“Go高效率开发Web参数校验的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!web开发中,你肯定见到过各种各样的表
2023-07-04

golang validator库参数校验实用技巧有哪些

这篇“golang validator库参数校验实用技巧有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang v
2023-06-30

java中invoke方法的参数有哪些

在Java中,invoke方法的参数有以下几种:1. 调用的对象(或者类):可以是一个实例对象或者一个类对象。2. 方法名:要调用的方法的名称。3. 方法的参数类型:指定方法的参数类型,如果方法有多个参数,则可以提供多个参数类型。4. 方法
2023-08-08

Nodejs中获取参数的方法有哪些

这篇文章给大家分享的是有关Nodejs中获取参数的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实现
2023-06-15

Python中函数参数传递方法有哪些

这篇文章主要介绍“Python中函数参数传递方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中函数参数传递方法有哪些”文章能帮助大家解决问题。定义和传递参数parameters
2023-07-06

java传递参数的方法有哪些

在Java中,传递参数的方法有以下几种:1. 值传递:基本数据类型(如int、char、boolean等)和字符串类型(String)都是以值传递的方式进行参数传递。在方法内对参数的修改不会影响原始值。2. 引用传递:对于引用类型(如数组、
2023-09-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录