使用场景
在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦:
- 验证代码繁琐,重复劳动
- 方法内代码显得冗长
- 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码
hibernate validator提供了一套比较完善、便捷的验证实现方式。
知识点
首先我们看一下进行校验时,使用的有哪些依赖包
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.4.Final</version>
</dependency>
主要使用的是这两个包,但在测试中,发现因为此包hibernate-validator
的版本问题,会出现@Valid 校验无效,BindingResult未获得错误
的问题。
如果大家遇到这种问题,先审查代码@valid 和BindingResult是否加入了,然后就可以考虑是不是版本的问题了。
笔者用另一台电脑测试了2.3.3版本的,同样可以校验
另外 spring-boot-starter-validation
依赖包含上述两个包,
所以我们不需要单独引入,只要引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
就可以自动匹配相应的依赖包,请看下图:
首先引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
附加一句:有的博客说引入了spring-boot-starter-web
就够了,内部自带引入了上述我们所需的两个包,但是我在2.3.4
这个版本中发现并没有引入,所以我们还是引入下吧
然后我们编写代码
userBo 需要验证的对象
@Data
public class UserBo {
@NotBlank(message = "用户不能为空")
//@NotNull(message = "用户不能为空")
@Length(min = 3,max = 9,message = "用户名最少3字符,最多9字符")
private String userName;
@NotBlank(message = "年龄不能为空")
@Length(min = 18,message = "年龄最小18岁")
private String age;
private String gender;
@Pattern(regexp = "^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\\d{8})$", message = "手机号格式不正确")
private String phone;
@Email
private String email;
}
知识点:
在写Controller
之前呢,有两个知识点
@Valid
该注解表示参数需要校验BindingResult
将校验结果返回
controller
@RestController
@RequestMapping("user")
public class UserController {
@PostMapping("/add")
public String addUser( @RequestBody @Valid UserBo userBo, BindingResult result) {
System.out.println(userBo);
System.out.println(result);
if (result.hasErrors()) {
Map<String, String> errors = getErrors(result);
System.err.println(errors);
}
return null;
}
private Map<String, String> getErrors(BindingResult result) {
Map<String, String> map = new HashMap<>();
List<FieldError> errorList = result.getFieldErrors();
for (FieldError error : errorList) {
// 发生验证错误所对应的某一个属性
String errorField = error.getField();
// 验证错误的信息
String errorMsg = error.getDefaultMessage();
map.put(errorField, errorMsg);
}
return map;
}
}
综上,比如遇到了
@valid 无法触发 BindingResult
问题 主要还是版本问题
参考以下文章,希望能给到大家帮助。
https://blog.csdn.net/Lao_gan_ma/article/details/119175862