RuoYi-Vue 前后端分离版代码浅析-Validation实践

586 阅读3分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

前言

本节介绍RuoYi-Vueruoyi-admin模块中的用户信息模块SysUserController 部分的代码, 今天我们讲解一下@Validated这个注解,在我们进行增删改查的时候,它可以帮助我们简化繁琐的数据验证代码。

javax.validation

javax.validation的一系列注解可以帮助我们完成参数校验,省去我们的一堆if else

image.png 比如上图中的

@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

image.png

image.png 此时我们看到对应注解校验是生效的状态。

image.png 而直接添加依赖,但是没有考虑版本号,就会不起效果。 使用如下的版本号就是不行,验证注解不起效果,就需要和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>

image.png

使用方法

我们新建一个实体类,对它进行校验,来讲解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种,只要简单的看看就可以了

image.png

分组验证

有时我们需要将一个实体类用在两个地方,比如增加用一次,更新用一次,那么我们该如何对这两个应用场景进行校验呢?
这就需要在注解上用到对应的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后面加上对应的分组就可以保证对应的验证按照分组来进行

image.png 需要注意的是如果加上了分组,那么整个实体类里面所有的需要验证的属性都要加上分组,否则不会验证

国际化