目录
1 前言
在我们编写后端项目的时候,常常需要对前端传送的数据进行校验。当然,我们可以使用if-else来进行校验,不过这样会使得我们的代码相当繁琐,因此我们需要引入Spring Validation,来帮我们简化操作、提升效率。
此文章只为提供一种校验思路并介绍大致步骤,若想深入了解Spring Validation可参考其它文章/视频。
2 使用步骤
2.1 pom.xml中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.2 在参数前添加@Pattern注解
举个例子,比如我们要写一个用户注册的方法,用户名和密码的长度要控制在[3, 10]之间,则有如下代码:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{3,10}$") String username, @Pattern(regexp = "^\\S{3,10}$") String password) {
//注意3,10这里,10之前不能打空格,比如:3, 10就会报错
//其它代码
}
}
解释一下@Pattern(regexp = "^\\S{3,10}$"的含义:
-
@Pattern
: 这是Java的注解之一,通常用于对字符串的格式进行验证。它配合regexp
参数来指定一个正则表达式,用于检查被注解的字符串参数是否符合某种模式。 -
regexp = "^\\S{3,10}$"
: 这是@Pattern
注解中的regexp
参数,表示要匹配的正则表达式。现在让我们分解这个正则表达式:^
: 表示匹配字符串的开始。\\S
: 表示匹配任意非空白字符。{3,10}
: 表示前面的字符(即非空白字符)的数量应该在3到10之间。$
: 表示匹配字符串的结束。
综合起来,这个正则表达式的意思是匹配一个长度在3到10之间的、由非空白字符组成的字符串。
2.3 在类上添加@Validated注解
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Result register(@Pattern(regexp = "^\\S{3,10}$") String username, @Pattern(regexp = "^\\S{3,10}$") String password) {
//注意3,10这里,10之前不能打空格,比如:3, 10就会报错
//其它代码
}
}
到此,还没有大功告成,用Postman进行测试,会发现得到一个500的报错,如下图,这并不是我们想要的,因此我们还需要配置一个异常处理器,来返回我们想要的数据类型。
2.4 编写异常处理器
//告诉SpringBoot这个类是用于处理异常的
@RestControllerAdvice
public class GlobalExceptionHandler {
//指定错误类型,这里是所有的异常
@ExceptionHandler(Exception.class)
//Result即我们想要返回的数据类型
public Result handleException(Exception e) {
//因为有部分异常没有封装信息,所有借助StringUtils.hasLength来进行判断
return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "未知错误");
}
}
我们再来进行测试,如下图,可以看到,我们得到了想要的结果。
到此,Spring Validation参数检验的大致方法和步骤已经介绍完毕。如果想更深入的了解参数校验,可以看我的这篇文章《SpringBoot中的实体参数校验及分组校验》。