飞道的博客

二、spring-boot-starter-validation开启参数校验使用详解

187人阅读  评论(0)

注解说明

spring关于数据校验的代码位于org.springframework.validation包下,其核心注解为@Validated,添加注解开启校验功能,如果数据异常则会统一抛出异常,方便异常中心统一处理。


参数验证 @Validated 和 @Valid 的区别:

  1. 所属框架:@Validated由spring框架提供,@Valid由validation框架提供
  2. 使用位置:@Validated可以用在类型、方法和方法参数上,但是不能用在成员属性上;
    @Valid可以用在方法、构造函数、方法参数和成员属性上
  3. 分组:@Validated提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制

GitHub地址
hibernate-validator支持注解及XML方式的进行数据校验。

javax.validation.constraints包下提供的注解:

注解 说明
AssertFalse 必须为false
AssertTrue 必须为true
DecimalMax 必须是一个数字,其值必须小于或等于指定的最大值,支持的类型:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其包装类
DecimalMin 必须是一个数字,其值必须大于或等于指定的最小值
Digits 必须是可接受范围内的数字
Email 字符串必须是格式正确的电子邮件地址
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

  1. @Null 验证对象是否为null

  2. @NotNull 验证对象是否不为null, 无法查检长度为0的字符串

  3. @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.

  4. @NotEmpty 检查约束元素是否为NULL或者是EMPTY.

案例演示

  1. 创建一个实体类
@ToString
@Data
public class User {
   

    @NotEmpty(message = "用户名不能为空")
    String userName;
    @NotNull(message = "密码不能为null")
    String password;
    int age;
    boolean isRegistered;
  1. 在controller方法上开启数据校验
    @GetMapping("/test001")
    public Object test001(@@Validated User user){
   
        return user;
    }
  1. 访问http://localhost:8000/test/test001?userName=111,发生异常,数据校验成功

布尔校验

  1. @AssertTrue :验证 Boolean 对象是否为 true
  2. @AssertFalse:验证 Boolean 对象是否为 false

案例演示

  1. isRegistered属性添加注解
    @AssertTrue(message = "注册状态必须为true")
    boolean isRegistered;
  1. 访问http://localhost:8000/test/test001?userName=111&password=123456&isRegistered=false,发生异常

长度校验

  1. @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
  2. @Length(min=, max=) 验证字符串是否在最小值和最大值之间

案例演示

  1. 对密码长度进行校验
    @NotNull(message = "密码不能为null")
    @Length(min = 10, max = 20, message = "密码长度必须在10-20之间")
    String password;
  1. 访问http://localhost:8000/test/test001?userName=111&password=123456&isRegistered=false,发生异常

日期校验

  1. @Past:验证 Date 和 Calendar 对象是否在当前时间之前
  2. @Future:验证 Date 和 Calendar 对象是否在当前时间之后

案例演示

  1. 对生日进行校验
@Past(message = "生日不能小于当前时间")
Date birthday;
  1. 访问http://localhost:8000/test/test001?birthday=2022/12/02%2010:50:25,发生异常

正则表达式校验

  1. @Pattern:验证 String 对象是否符合正则表达式的规则

案例演示

  1. 对用户名进行数字字母正则校验
    @Pattern(message = "用户名只能是数字字母",regexp = "^[A-Za-z0-9-]*")
    String userName;

数值校验

建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null。

  1. @Min:验证 Number 和 String 对象是否大等于指定的值
  2. @Max:验证 Number 和 String 对象是否小等于指定的值
  3. @DecimalMax:被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
  4. @DecimalMin :被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
  5. Digits(integer=,fraction=):验证 Number 和 String 的构成是否合法 ,interger指定整数精度,fraction指定小数精度。
  6. @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;

其他校验

  1. @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验
  2. @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
  3. @ScriptAssert(lang= ,script=, alias=) 类级约束,评估一个脚本表达对注释的元素
  4. @URL(protocol=,host=, port=,regexp=, flags=) 验证URL地址是否有效

转载:https://blog.csdn.net/qq_43437874/article/details/116988733
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场