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
- 作者在积极优化中,版本发布说明