这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
前言
本节介绍RuoYi-Vue
的ruoyi-admin
模块中的用户信息模块SysUserController
部分的代码,
今天我们讲解一下@Validated
这个注解,在我们进行增删改查的时候,它可以帮助我们简化繁琐的数据验证代码。
javax.validation
javax.validation的一系列注解可以帮助我们完成参数校验,省去我们的一堆if else
比如上图中的
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName()
{
return userName;
}
如果我们使用代码进行校验,那么我们将会面对的是
if (StringUtils.isBlank(user.getUserName())) {
return AjaxResult.error("用户账号不能为空");
} else if (user.getUserName().length() > 30) {
return AjaxResult.error("用户账号长度不能超过30个字符");
}
这只是一个属性,如果要进行验证,往往还会面对增加修改各写一遍的问题,这时候就需要我们来使用javax.validation来帮助我们在需要校验的时候进行校验了。hibernate-validator是他的一个实现。 推荐用spring提供的spring-boot-starter-validation,防止由于版本问题导致校验根本不起效果。
org.springframework.boot spring-boot-starter-validation 2.5.6
此时我们看到对应注解校验是生效的状态。
而直接添加依赖,但是没有考虑版本号,就会不起效果。
使用如下的版本号就是不行,验证注解不起效果,就需要和spring-boot-starter-validation里的版本号保持一致才可以起效果。
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
使用方法
我们新建一个实体类,对它进行校验,来讲解hibernate-validator使用的方法。
@Data
public class SysUser {
@NotBlank(message = "id不能为空", groups = {Update.class})
private Integer id;
@NotBlank(message = "{SysUser.userName.NotBlank}", groups = {Add.class, Update.class})
@Length(min = 6, max = 20, message = "用户名长度为6-20位", groups = {Add.class, Update.class})
private String userName;
@NotBlank(message = "密码不能为空")
private String password;
public interface Add {
}
public interface Update {
}
}
注解
@NotBlank(message = "密码不能为空")
private String password;
javax.validation.constraints
里的的注解有22种,只要简单的看看就可以了
分组验证
有时我们需要将一个实体类用在两个地方,比如增加用一次,更新用一次,那么我们该如何对这两个应用场景进行校验呢?
这就需要在注解上用到对应的groups
,来表明它是属于哪个分组的。
比如上面的id属性在更新时需要不能为空,但是增加时就不需要展示,因此我们可以在实体类中加上group进行区分,同时要在对应的Controller处添加分类
@PostMapping("/testAddValidation")
public boolean testAddValidation(@Validated(SysUser.Add.class) @RequestBody SysUser user) {
return true;
}
@PostMapping("/testUpdateValidation")
public boolean testUpdateValidation(@Validated(SysUser.Update.class) @RequestBody SysUser user) {
return true;
}
这样在Validated后面加上对应的分组就可以保证对应的验证按照分组来进行
需要注意的是如果加上了分组,那么整个实体类里面所有的需要验证的属性都要加上分组,否则不会验证