【框架简介】
Spring Boot Validation是Spring Boot整合了Hibernate Validation的一个框架,其核心是Hibernate Validation,此框架的作用是检验客户端向服务器端提交的请求参数的基本格式是否合法。

例如,当设计一个“登录”功能时,客户端可能需要向服务器端提交用户名、密码这2项数据,如果客户端没有提交用户名,或没有提交密码,这个请求必然是无效的,是不可能成功登录的,则服务器端应该直接响应一个错误信息,根本不需要连接数据库去验证用户信息是否正确!另外,如果客户端提交的用户名是例如a或(1个空格)这样的数据,很显然也是不合法的!此类对于数据的基本格式的检验,就可以通过Spring Boot Validation便捷的实现!

【需求】
使用Spring Boot框架实现用户登录(不关心如何验证用户名与密码),检验用户名和密码的基本格式。

【实现步骤】
使用Spring Boot工程,在创建过程中需要注意:
建议使用Spring Boot 2.5.x版本,如果已经没有此版本的选项,则选择2.6.x版本,非常不建议选择3.x.x版本
需要勾选Web > Spring Web和IO > Validation这2个依赖项

在项目的cn.tedu.validation.demo包中创建UserController类,作为控制器类,并在其中添加处理登录的方法:

Plain Text
package cn.tedu.validation.demo;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController { // http://localhost:8080/login?username=root&password=1234 @RequestMapping("/login") public String login(String username, String password) { System.out.println("username = " + username + ", password = " + password); return “OK”; }}
接下来,可以启动项目,并通过 http://localhost:8080/login?username=root&password=1234 测试访问,你还可以修改网址中的用户名和密码的值,在IntelliJ IDEA的控制台上会显示你提交的用户名和密码
如果希望使用Spring Boot Validation验证请求参数的基本格式,应该将以上方法中接收的用户名和密码这2个数据封装起来,例如创建UserLoginDTO类,并在其中声明用户名和密码这2个属性,按照开发规范添加Setter & Getter方法,同时,为了便于查看数据,再生成toString方法,代码如下:

Plain Text
package cn.tedu.validation.demo;public class UserLoginDTO { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return “UserLoginDTO{” + “username=’” + username + ‘’’ + “, password=’” + password + ‘’’ + ‘}’; } }
接下来,原本处理请求的方法的参数就可以由2个字符串改为以上这1个类的对象:

Plain Text
@RequestMapping("/login")public String login(UserLoginDTO userLoginDTO) { System.out.println("userLoginDTO = " + userLoginDTO); return “OK”;}
当需要验证请求参数的基本格式时,需要在以上方法的参数之前添加@Valid或@Validated注解(这2个注解是等效的),表示需要对此参数进行验证:

Plain Text
@RequestMapping("/login")// 注意:下一行的参数添加了@Valid注解public String login(@Valid UserLoginDTO userLoginDTO) { System.out.println("userLoginDTO = " + userLoginDTO); return “OK”;}
接下来,在UserLoginDTO类的属性上,添加注解,以配置验证规则及出错时的提示文本,例如:

Plain Text
public class UserLoginDTO { @NotNull(message = “登录失败,必须提交用户名!”) private String username; private String password; // 省略后续代码 }
接下来,重新启动项目,提交一个没有用户名的请求,例如 http://localhost:8080/login?password=0000 ,则会提示错误,并且,在IntelliJ IDEA控制台可以看到:

Plain Text
2022-03-30 20:09:35.270 WARN 10384 — [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errorsField error in object ‘userLoginDTO’ on field ‘username’: rejected value [null]; codes [NotNull.userLoginDTO.username,NotNull.username,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userLoginDTO.username,username]; arguments []; default message [username]]; default message [登录失败,必须提交用户名!]]
提示:与@NotNull相似的注解还有@NotBlank、@NotEmpty,这几个是区别的:
@NotNull:不允许为null值,如果客户端提交的参数中根本没有这一项,则视为null
@NotBlank:不允许为空白值,空白值包括由若干个空格、TAB符等组成字符
@NotEmpty:不允许为空字符串,即不允许是长度为0的字符串