返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot参数校验的方法总结
  • 374
分享到

SpringBoot参数校验的方法总结

2024-04-02 19:04:59 374人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、注解介绍三、添加依赖四、创建用于校验的实体类五、写一个测试用的接口六、在实体类中添加注解七、在 controller 方法中添加 Validated 注解八、添加全局

一、前言

在上一篇mybatis-plus 初体验 中已经简单实现了 MyBatis-Plus 数据库查询。我们知道 CURD 离不开前后端的数据交互,因此参数校验是必不可少的。这篇主要讲一下 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 类:

在这里插入图片描述

本来想直接复用之前创建的 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 注解如下,代码与上面等效:


@Data
public class UserDTO {
	private String username;
	private Integer age;
}

五、写一个测试用的接口

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


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

六、在实体类中添加注解

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


@Data
public 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 校验会不起作用。

在这里插入图片描述

用下面的数据测试一下:


{
    "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 [用户名不能为空]] ]

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

在这里插入图片描述

八、添加全局异常处理

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



@RestControllerAdvice
public 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 表示捕获全部异常。不要用一个方法处理所有的异常,而是一个方法处理一种异常。如果需要处理其他异常,可以在下面添加方法。

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

在这里插入图片描述

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

Method invocation ‘getDefaultMessage' may produce ‘NullPointerException'

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



@RestControllerAdvice
public 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;
    }

    // 其他异常处理方法
}

响应内容如下:

在这里插入图片描述

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

九、分组校验

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


@Data
public 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 {}
}

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


@Data
public 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参数校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot参数校验的方法总结

本文链接: https://lsjlt.com/news/126712.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot参数校验的方法总结
    目录一、前言二、注解介绍三、添加依赖四、创建用于校验的实体类五、写一个测试用的接口六、在实体类中添加注解七、在 controller 方法中添加 Validated 注解八、添加全局...
    99+
    2024-04-02
  • SpringBoot进行参数校验的方法详解
    目录介绍1.SpringBoot中集成参数校验1.1引入依赖1.2定义参数实体类1.3定义校验类进行测试1.4打开接口文档模拟提交数据2.参数异常加入全局异常处理器3.自定义参数校验...
    99+
    2024-04-02
  • SpringBoot中参数校验的方法有哪些
    这篇文章给大家分享的是有关SpringBoot中参数校验的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验、非空校验等,基本上每个...
    99+
    2023-06-15
  • SpringBoot参数怎么校验
    本篇内容主要讲解“SpringBoot参数怎么校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot参数怎么校验”吧!使用传统方式的弊端public String&nb...
    99+
    2023-06-30
  • SpringBoot 中使用 Validation 校验参数的方法详解
    目录1. Validation 介绍1.1 Validation 注解1.2 @valid 和 @validated的区别2. SpringBoot 中使用 Validator 校验...
    99+
    2024-04-02
  • SpringBoot集成Validation参数校验的方法是什么
    这篇“SpringBoot集成Validation参数校验的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri...
    99+
    2023-06-26
  • SpringBoot集成Validation参数校验
    本文实例为大家分享了SpringBoot集成Validation参数校验的具体代码,供大家参考,具体内容如下 1、依赖 SpringBoot在web启动器中已经包含validator...
    99+
    2024-04-02
  • springboot 参数格式校验操作
    springboot 参数格式校验 @Validated 字面意思校验 @RequestBody 该注解不用多说,意思是接收为json格式的参数 @Validated 字面意...
    99+
    2024-04-02
  • springboot参数格式怎么校验
    这篇文章主要介绍“springboot参数格式怎么校验”,在日常操作中,相信很多人在springboot参数格式怎么校验问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot参数格式怎么校验”的疑...
    99+
    2023-06-08
  • SpringBoot怎么进行参数校验
    这篇文章主要讲解了“SpringBoot怎么进行参数校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么进行参数校验”吧!介绍在日常的接口开发中,为了防止非法参数对业务...
    99+
    2023-06-30
  • springboot接口参数校验JSR303的实现
    目录一、在controller接口处理校验异常二、统一异常处理三、错误码枚举类四、自定义参数校验注解在 javax.validation.constraints包中定义了非常多的校验...
    99+
    2022-11-13
    springboot接口参数校验JSR303 springboot JSR303
  • springboot 中怎么校验参数格式
    本篇文章给大家分享的是有关springboot 中怎么校验参数格式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot 参数格式校验@Validated 字面意思...
    99+
    2023-06-20
  • SpringBoot参数校验Validator框架详解
    目录SpringBoot 如何进行参数校验1.集成Validator校验框架1.1. 引入依赖包1.2. 定义要参数校验的实体类1.3. 定义校验类进行测试1.4. 测试结果11.5...
    99+
    2024-04-02
  • Springboot 如何使用BindingResult校验参数
    目录使用BindingResult校验参数1、创建一个参数对象2、controller控制层写参数接收的入口3、传入参数和控制台打印结果4、常用校验注解BindingResult 作...
    99+
    2024-04-02
  • SpringBoot参数校验的最佳实战教程
    目录前言hibernate-validator基本使用 引入依赖 编写需要验证对象 验证对象属性是否符合要求 验证规则 空/非空验证bool时间数学 字符串模板正则 SpringBo...
    99+
    2024-04-02
  • SpringBoot各种参数校验的实例教程
    目录 简单使用引入依赖requestBody参数校验requestParam/PathVariable参数校验统一异常处理进阶使用分组校验嵌套校验集合校验自定义校验编程式校...
    99+
    2024-04-02
  • SpringBoot参数校验之@Valid的使用详解
    目录简介依赖代码 测试测试1:缺少字段测试2:不缺少字段测试3:缺少字段,后端获取BindResult 简介 说明 本文用示例说明SpringBoot的@Vali...
    99+
    2024-04-02
  • SpringBoot参数校验之@Validated的使用详解
    目录简介依赖用法1:不分组代码测试用法2:分组代码测试简介 说明 本文用示例说明SpringBoot的@Validated的用法。 依赖 <dependency> ...
    99+
    2024-04-02
  • 关于SpringBoot中controller参数校验的使用
    目录单参数校验实体类校验分组校验嵌套校验自定义注解参数校验主要使用两个标签@Validated和@Valid; @Valid是Hibernate的注解校验,@Validated是sp...
    99+
    2023-01-15
    SpringBoot controller参数校验 SpringBoot 参数校验
  • SpringBoot2.x 参数校验问题小结
    目录一、引入依赖二、实体类三、常用的校验注解四、校验Controller中的参数五、校验Service中的参数六、编程式校验七、自定义校验注解八、分组校验九、嵌套的参数校验本文主要对...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作