注解说明
spring关于数据校验的代码位于org.springframework.validation包下,其核心注解为@Validated,添加注解开启校验功能,如果数据异常则会统一抛出异常,方便异常中心统一处理。
参数验证 @Validated 和 @Valid 的区别:
- 所属框架:@Validated由spring框架提供,@Valid由validation框架提供
- 使用位置:@Validated可以用在类型、方法和方法参数上,但是不能用在成员属性上;
@Valid可以用在方法、构造函数、方法参数和成员属性上 - 分组:@Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
GitHub地址
hibernate-validator支持注解及XML方式的进行数据校验。
javax.validation.constraints包下提供的注解:
注解 | 说明 |
---|---|
AssertFalse | 必须为false |
AssertTrue | 必须为true |
DecimalMax | 必须是一个数字,其值必须小于或等于指定的最大值,支持的类型:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其包装类 |
DecimalMin | 必须是一个数字,其值必须大于或等于指定的最小值 |
Digits | 必须是可接受范围内的数字 |
字符串必须是格式正确的电子邮件地址 | |
Future | 必须是将来的瞬间,日期或时间 |
FutureOrPresent | 必须是现在或将来的一个瞬间,日期或时间 |
Max | 必须是一个数字,其值必须小于或等于指定的最大值 |
Min | 必须是一个数字,其值必须大于或等于指定的最小值 |
Negative | 必须是严格的负数(即0被认为是无效值) |
NegativeOrZero | 必须为负数或0 |
NotBlank | 不能为null,并且必须至少包含一个非空白字符 |
NotEmpty | 不能为null也不能为空 |
NotNull | 不能为null |
Null | 必须为null |
Past | 必须是过去的瞬间,日期或时间 |
PastOrPresent | 必须是过去或现在的瞬时,日期或时间 |
Pattern | 必须与指定的正则表达式匹配。 正则表达式遵循Java正则表达式约定 |
Positive | 必须是严格的正数(即0被视为无效值) |
PositiveOrZero | 必须为正数或0 |
Size | 大小必须在指定的边界(包括在内)之间 |
hibernate也扩展了很多注解,位于org.hibernate.validator.constraints包下:
注解 | 说明 |
---|---|
CNPJ | 验证CNPJ(巴西企业纳税人注册号) |
CPF | 验证CPF(巴西个人纳税人登记号) |
TituloEleitoral | 巴西选民身份证号码 |
NIP | 验证是否为NIP编号(9位波兰增值税标识号 |
PESEL | 验证PESEL(波兰国家识别号) |
INN | 俄罗斯纳税人识别号 |
REGON | 验证REGON编号(9/14位波兰纳税人识别号) |
DurationMax | 必须小于或等于DurationMax#nanos()、DurationMax#millis()等 |
DurationMin | 必须大于于或等于DurationMax#nanos()、DurationMax#millis()等 |
CodePointLength | 验证字符序列的长度是否在最小值和最大值之间 |
ConstraintComposition | 应用于组合约束注释的所有约束的布尔运算符 |
CreditCardNumber | 带注释的元素必须表示有效的信用卡号码,这是Luhn算法的实现,它的目的是检查用户的错误,而不是信用卡的有效性 |
Currency | 必须是正确的 |
EAN | 列是否为有效数字,并验证校验位 |
ISBN | 验证ISBN字符是否有效,号码的长度和校验位都经过验证 |
Length | 验证字符串是否在最小值和最大值之间 |
LuhnCheck | Luhn算法检查约束 |
Mod10Check | 允许验证一系列数字是否通过Mod10校验和算法。经典的Mod10是通过对每个奇数的数字求和来计算的数字(从右到左)值乘以{@code multiplier}。 |
Mod11Check | 验证一系列数字是否通过Mod11校验和算法。对于最常见的Mod11变量,总和计算是通过将从最右边的数字(不包括校验数字)到最左边的数字。重量从2开始,每个数字增加1。然后将结果用于使用{@code11-(sum%11)}计算校验位 |
Normalized | 验证字符序列是否为规范化形式。可以通过设置规范化策略来验证规范化值 |
ParameterScriptAssert | 方法级约束,用于根据带注释的方法或构造函数。此约束可用于实现依赖于带注释对象的多个参数的验证例程 |
Range | 必须在适当的范围内。应用于数值或字符串数值的表示 |
ScriptAssert | 类级约束,用于根据带注释的元素。此约束可用于实现验证依赖于带注释元素的多个属性的例程 |
UniqueElements | 验证所提供的{@link Collection}中的每个对象都是唯一的,即我们在其中找不到2个相等的元素 |
URL | 字符串是否为URL |
spring boot使用@Validated案例
在实际开发中,后台数据校验一般放在controller层,使用@Validated集合hibernate提供的一些列注解,可以很轻松优雅的实现数据校验的功能。
空检验
@NotEmpty 用在集合类上面,@NotBlank 用在String上面,包括””和null,@NotNull 用在基本类型上,包括null
-
@Null 验证对象是否为null
-
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
-
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
-
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
案例演示:
- 创建一个实体类
@ToString
@Data
public class User {
@NotEmpty(message = "用户名不能为空")
String userName;
@NotNull(message = "密码不能为null")
String password;
int age;
boolean isRegistered;
- 在controller方法上开启数据校验
@GetMapping("/test001")
public Object test001(@@Validated User user){
return user;
}
- 访问http://localhost:8000/test/test001?userName=111,发生异常,数据校验成功
布尔校验
- @AssertTrue :验证 Boolean 对象是否为 true
- @AssertFalse:验证 Boolean 对象是否为 false
案例演示:
- isRegistered属性添加注解
@AssertTrue(message = "注册状态必须为true")
boolean isRegistered;
- 访问http://localhost:8000/test/test001?userName=111&password=123456&isRegistered=false,发生异常
长度校验
- @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
- @Length(min=, max=) 验证字符串是否在最小值和最大值之间
案例演示:
- 对密码长度进行校验
@NotNull(message = "密码不能为null")
@Length(min = 10, max = 20, message = "密码长度必须在10-20之间")
String password;
- 访问http://localhost:8000/test/test001?userName=111&password=123456&isRegistered=false,发生异常
日期校验
- @Past:验证 Date 和 Calendar 对象是否在当前时间之前
- @Future:验证 Date 和 Calendar 对象是否在当前时间之后
案例演示:
- 对生日进行校验
@Past(message = "生日不能小于当前时间")
Date birthday;
- 访问http://localhost:8000/test/test001?birthday=2022/12/02%2010:50:25,发生异常
正则表达式校验
- @Pattern:验证 String 对象是否符合正则表达式的规则
案例演示:
- 对用户名进行数字字母正则校验
@Pattern(message = "用户名只能是数字字母",regexp = "^[A-Za-z0-9-]*")
String userName;
数值校验
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null。
- @Min:验证 Number 和 String 对象是否大等于指定的值
- @Max:验证 Number 和 String 对象是否小等于指定的值
- @DecimalMax:被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
- @DecimalMin :被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
- Digits(integer=,fraction=):验证 Number 和 String 的构成是否合法 ,interger指定整数精度,fraction指定小数精度。
- @Range(min=, max=) 检查数字是否介于min和max之间
案例演示:
@Min(value = 1, message = "年龄不能小于1")
@Max(value = 150, message = "年龄不能大于100")
int age;
@DecimalMax(message = "金额不能大于99.99",value = "99.99")
@DecimalMin(message = "金额不能小于0.99",value = "0.99")
Double money;
@Range(min = 1,max = 200,message = "年龄必须在1-200之间")
int age;
@Digits(integer = 3, fraction = 2,message = "金额的整数不能超过3位,小数部分不能超过2位")
Double money;
其他校验
- @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验
- @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
- @ScriptAssert(lang= ,script=, alias=) 类级约束,评估一个脚本表达对注释的元素
- @URL(protocol=,host=, port=,regexp=, flags=) 验证URL地址是否有效
转载:https://blog.csdn.net/qq_43437874/article/details/116988733