目录
一.ruoyi与参数验证
1.触发报错
对参数验证的使用,从触发参数报错开始,首先对ruoyi人为触发一次报错,在前后端分离的ruoyi中触发的报错分析,需要从前端开始。
2.后端现象
通过图中报错信息我们可以知道
GlobalExceptionHandler捕获了异常。
在SysRoleController.edit处抛出的异常。
具体的异常是Field error in object ‘sysRole’ on field ‘roleName’: rejected value [1231231233211232231132221321331212312321312323121323123131212332121312321331231221323121331]。
二.源码分析
1.前端代码
前端对输入框做了限制,如果输入框为空,就用message来显示。
点击确认后通过updateRole 函数对URI 为/system/role 发起HTTP PUT 操作
从开发者工具中也可以看到请求的URL地址
后端返回信息后,前端的处理逻辑,返回code 为500 时,输出错误提示Message 框
2.后端代码
SysRole对roleName的限制如下图所示,如果输入框满足下面任意一个条件就会抛出异常
异常处理如下图所示
3.报错分析
1.修改前端角色名称长度超过30
2.点击确定与后台交互,请求URI:/system/role
3.后台检测到SysRole 的参数roleName 不符合要求,则抛出异常类型MethodArgumentNotValidException
4.异常被全局异常处理器捕获,返回message 给到前端,且错误码是500
5.前端路由截获错误码500 的信息,进行处理显示message 内容
三.自定义函数注解
在ruoyi-framework目录下的pom.xml中引入验证validation依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1.NoNumber注解
新增NoNumber注解,设置自定义校验器NoNumberMain.class
在ruoyi-common目录的下的annotation目录中创建NoNumber注解
package com.ruoyi.common.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR,ElementType.PARAMETER})
@Constraint(validatedBy = {NoNumberMain.class})
public @interface NoNumber {
String message()
default "输入的内容中不允许存在数字";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2.NoNumberMain校验器
自定义NoNumber校验器,实现ConstraintValidator接口
在ruoyi-common目录的下的annotation目录中创建NoNumberMain
package com.ruoyi.common.annotation;
import com.ruoyi.common.utils.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NoNumberMain implements ConstraintValidator<NoNumber, String> {
private final String PATTERN = "^[0-9]*$";
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (StringUtils.isBlank(value)) {
return false;
}
return !containNumber(value);
}
public boolean containNumber(String value) {
if (value == null) {
return false;
}
return value.matches(PATTERN);
}
}