目录
2.4.2jakarta.validation.constraints展示
1.分析RuoYi参数验证
参数验证:有助于确保应用程序接收到的输入是合法且符合预期的,保证应用程序质量和安全性的关键步骤,它有助于捕获和处理潜在问题,提高系统的可靠性和稳定性。
1.1 触发验证抛出异常
1.1.1触发方式
输入过长的部门名称
1.1.2 前端现象
有提示框显示,部门名称长度不能超过30 个字符
1.1.3 后端现象
在log中查看发现,从中我们可以得出:
1.WARN 关键字:有捕获异常Exception
2.ExceptionHandlerExceptionResolver捕获了异常
3.从com.ruoyi.web.controller.system.SysDeptController.add(com.ruoyi.common.core.domain.
entity.SysDept)抛出的异常
4.具体抛出的异常:Field error in object 'sysDept' on field 'deptName': rejected value [1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111]
5.抛出的异常类型:MethodArgumentNotValidException
1.2 源码分析
1.2.1前端代码
从浏览器开发者工具可以看到,整体的HTTP 请求URL 为
http://localhost:81/dev-api/system/dept
在预览中,我们可以看到后端返回信息后,前端的处理逻辑,返回code 为500 时,输出错误提示Message 框
1.2.2后端代码
接下来就是看后端代码,首先我们找到后端/system/dept的路径
SysDept 类对属性roleName 的限制如下
当deptName 不满足两个注解限制时,会抛出异常
1.3 小结
添加部门报错,分析逻辑总结:
1.修改前端角色名称长度超过30,如11111111111111111111111111111111111111
2.点击确定与后台交互,请求URI:/system/dept
3.后台检测到SysDept 的参数deptName 不符合要求,则抛出异常类型MethodArgumentNotValidException
4.异常被全局异常处理器捕获,返回message 给到前端,且错误码是500
5.前端路由截获错误码500 的信息,进行处理显示message 内容
2.学习自定义[参数验证的]注解
通过分析RuoYi的代码,已经对自定义[参数验证的]注解有了一定的了解,下面展示的是:参考官方文档,自定义[参数验证的]注解,触发验证抛出异常报错的学习。
2.1 注入依赖
2.2 controller层(定义控制器)
在 addUser
方法的参数列表中使用 @Valid
注解进行参数校验,@RequestBody
注解用于将请求体中的 JSON
对象自动映射为 Java
对象。
因为本文主要讲的是自定义[参数验证的]注解,剩下的SMD层就不过多的赘述。
2.2自定义注解
2.3 在实体类中需要抛出异常信息的属性上添加注解
在这里@NotEmpty是自定义的注解,@NotNull和@Postive为jakarta.validation依赖所带的。这里我想都尝试两种方式。
在 User
类的属性上使用校验注解,message
属性用于指定校验失败时的错误提示信息。
2.4自定义注解和参数校验器
2.4.1自定义注解
-
@Documented
: 该注解表示这个注解应该被包含在 JavaDoc 中。 -
@Constraint(validatedBy = { NotEmpty.NotEmptyValidator.class })
: 这个注解指定了用于验证的验证器类,即NotEmptyValidator
。 -
@Target({ ElementType.FIELD })
: 这个注解表示@NotEmpty
只能应用于类的字段。 -
@Retention(RetentionPolicy.RUNTIME)
: 这个注解表示@NotEmpty
注解在运行时保留。 -
@NotNull
和@NotBlank
: 这两个注解是 Bean Validation 提供的标准注解,用于验证字段非空。@NotNull
用于确保字段不为 null,而@NotBlank
则用于确保字符串字段不为空(不包含空格)。 -
@ReportAsSingleViolation
: 这个注解表示当有多个验证约束时,只报告一个违规,而不是每个约束都报告。
2.4.2自定义参数校验器
因为我定义的内容比较简单,所以将自定义参数校验器也写进了注解里。
自定义注解的验证逻辑相对简单且专用时。通过将验证逻辑写在注解内部,可以更方便地组织和管理相关的代码,并减少在项目中创建大量的小型验证器类。此外,将验证逻辑嵌套在注解内也使得这些逻辑更容易理解和维护。
2.4 Postman的响应结果
2.4.1自定义的展示
2.4.2jakarta.validation.constraints展示