final-validator 是一个JavaBean元数据校验模型和方法验证,能够自定义注解来扩展校验范围,符合国内开发习惯的参数校验java库。
jdk8+ springboot2.x springboot3.x springmvc5.x springmvc6.x 非spring体系项目
<dependency>
<groupId>top.lingkang</groupId>
<artifactId>final-validator</artifactId>
<version>2.3.0</version>
</dependency>import top.lingkang.finalvalidated.constraints.Length;
import top.lingkang.finalvalidated.constraints.Tag;
@Data
public class LoginParam {
@NotBlank// 不为空
@Length(min = 6, max = 20) // 长度范围 6~20
private String username;
@Tag("密码")
@NotBlank
@Length(min = 6, max = 20) // 长度范围 6~20
private String password;
}@RequestMapping("/login")
public Object login(@ValidObject LoginParam param) {
return param;
}注意,不添加@ValidObject注解将导致无法使用final-validator的校验功能
若校验不通过将会抛出 top.lingkang.finalvalidated.error.ValidatedException 异常,捕获它自定义返回前端值。例如下面这样:
@RestControllerAdvice
public class ExceptionConfig {
// 使用spring自带的 json格式化 Jackson库
private final ObjectMapper mapper = new ObjectMapper();
/**
* 捕获校验异常,返回rest结果
*/
@ExceptionHandler(ValidatedException.class)
public Object v(ValidatedException e) throws Exception {
Map<String, Object> map = new HashMap<>();
map.put("code", 1);
map.put("msg", mapper.readValue(e.getMessage(), Map.class));
// map.put("msg", mapper.readValue(e.getMessage(), Map.class)); // json格式化校验失败的结果
// map.put("object", e.getObjectName());
// map.put("filed", e.getFiledName());
return map;
}
}启动springboot,访问与结果返回:
/login?username=&password=
返回结果
{"msg":{"username":"不能为空"},"code":1}/login?username=123&password=
返回结果
{"msg":{"username":"字符长度范围: 6 ~ 20"},"code":1}/login?username=123456&password=123
返回结果
{"msg":{"密码":"字符长度范围: 6 ~ 20"},"code":1}/login?username=123456&password=12345678
返回结果
{"username":"123456","password":"12345678"}若你想直接校验某个参数对象,可以直接调用:
LoginParam param=new LoginParam();
param.setUsername("admin");
// 校验,失败时会通过 ValidatedException 异常抛出,
// 能够通过 ValidatedException 获取到 字段名称、对象名称、错误信息等。
FinalValidator.valid(param);调用 FinalValidator.init() 初始化后,任意地方调用FinalValidator.valid(param)即可。
public static void main(String[] args) {
// 初始化校验,只需初始化一次即可
FinalValidator.init();
LoginParam param=new LoginParam();
param.setUsername("admin");
// 校验,失败时会通过 ValidatedException 异常抛出,
// 能够通过 ValidatedException 获取到 字段名称、对象名称、错误信息等。
FinalValidator.valid(param);
}solon: final-validator-solon
可以自定义注解,自己实现校验,请查看:添加自定义注解
final-validator 默认的消息文字位于 defaultValidated.properties。
若您想自定义,可在resources下添加一个 finalValidated.properties配置文件,框架初始化时将会加载并覆盖原有的默认配置。
NotBlank={message} 不能是空值具体key-value需要参考:defaultValidated.properties
底层原理介绍:https://lingkang.top/archives/final-validator-shou-lu-validator
底层缓存了注解处理,性能几乎可以忽略不计。
| 验证注解 | 说明 |
|---|---|
| @NotBlank | 注解的属性必定不为空、不为空格字符 |
| @NotEmpty | 注解的属性必定不为空、但可以为空格字符 |
| @NotNull | 注解的属性必定不是空,即 非 null 值 |
| @Null | 注解的属性必定是空,即 null 值 |
| @Min | 注解的属性最小值,小于等于 |
| @Max | 注解的属性最大值,不大于等于 |
| @Length | 注解的属性的长度,指定最小长度和最大长度,min与max不能相等 |
| @AssertFalse | 验证注解的元素值是否是 false ,当值为 false 时将通过校验 |
| @AssertTrue | 验证注解的元素值是否是 true ,当值为 true 时将通过校验 |
| 注解的属性的值是否是邮箱 | |
| @Pattern | 注解的属性的值是否符合自定义正则表达式 |
| @Tag | 注解的属性的tag值,将会覆盖该字段其他注解的所有tag值(v1.1.1) |
@Pattern(value = "^[a-zA-Z0-9_]{4,20}$", message = "账号只能由字母、数字、下划线组成,并且长度为4~20个字符")
private String username;@Pattern(value = "男|女|保密", message = "性别只能是:男、女或保密")
private String sex;- 有更好的建议请提 Issues
- 使用快照版本 SNAPSHOT
- 默认的校验消息 defaultValidated.properties
- 作者在积极优化中,版本发布说明