SpringFramework特性(一)校验注解的分类和作用

  • A+

SpringFramework是SpringBoot的基石,所以在SpringBoot中使用validator进行验证,实际使用的是SpringFramework中的bean验证特性。而在SpringFramework中集成的是实现了JSR-303标准的Hibernate验证框架,所以我们使用的大多数与验证相关的注解都是Hibernate验证框架实现的。

1.在SpringBoot中使用validator

  • 引入validator,在SpringBoot中我们引入了spring-boot-starter-web包的同时,它所依赖的spring-boot-starter-validation启动包也将引入,所以我们不需要特殊的引入validator依赖;使用maven命令mvn dependency:tree,可查看依赖的传递,如下:
    [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.2.0.RELEASE:compile
    [INFO] |  +- org.springframework.boot:spring-boot-starter-validation:jar:2.2.0.RELEASE:compile
    [INFO] |  |  +- jakarta.validation:jakarta.validation-api:jar:2.0.1:compile
    [INFO] |  |  \- org.hibernate.validator:hibernate-validator:jar:6.0.17.Final:compile
    [INFO] |  |     +- org.jboss.logging:jboss-logging:jar:3.4.1.Final:compile
    [INFO] |  |     \- com.fasterxml:classmate:jar:1.5.0:compile
    
  • 使用@Validated,在SpringBoot需要使用@Validated注解开启校验,范例如下:
    @RestController
    @Validated
    public class ValidationTestWebController {
    
        @PostMapping("/testValidated")
        public @Length(min = 1,max = 10)String testValidated( @Length(min = 1,max = 3)@RequestParam String firstName ){
            String LastName="Joey";
            return  firstName+"."+LastName;
        }
    }
    
    1. SpringBoot数据验证官方文档点击此处
    2. 范例中@Length注解保证了传入参数和返回参数的长度最小1,最长3。

2.约束性注解

  • 我们来分类一下注解
    1. SpringFramework框架提供的注解@Validated,在spring-context-5.2.0.RELEASE.jar包下,目标类使用Spring的@Validated进行注释,触发spring的方法验证,当然除此之外也有验证组的功能,(若想查看spring官方的定义,点击此处)
    2. bean约束规范(若想查看此标准的官方文档点击此处)提供了一系列注解,在jakarta.validation-api-2.0.1.jar包下,包括:
      注解 注释 作用范围
      @Valid 开启容器验证和级联验证 用于非原始字段 高频
      @Size 检查带注释的元素的大小是否介于min和之间max(包括) CharSequence,Collection,Map和数组 高频
      @PositiveOrZero 检查元素是正数还是零 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @Positive 检查元素是否严格为正。零值被视为无效。 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @Pattern regex考虑给定正则表达式,检查带注释的字符串是否与正则表达式匹配match CharSequence 高频
      @PastOrPresent 检查带注释的日期是过去还是现在 java.util.Date,java.util.Calendar,java.time.LocalDate等时间类型 高频
      @Past 检查带注释的日期是否是过去的日期 java.util.Date,java.util.Calendar,java.time.LocalDate等时间类型 高频
      @Null 检查注释的值是 null 随便任何类型 高频
      @NotNull 检查注释的值不是 null 随便任何类型 高频
      @NotEmpty 检查带注释的元素是否不为null或为空 CharSequence,Collection,Map和数组 高频
      @NotBlank 检查带注释的字符序列不为null,并且修剪的长度大于0。与的不同之处@NotEmpty在于,此约束只能应用于字符序列,并且尾随空白将被忽略 CharSequence 高频
      @NegativeOrZero 检查元素是负数还是零 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @Negative 检查元素是否严格为负。零值被视为无效。 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @Min 检查带注释的值是否大于或等于指定的最小值 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @Max 检查带注释的值是否小于或等于指定的最大值 BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装;Number和的任何子类,CharSequence及子类(评估字符表示的数值)等 高频
      @FutureOrPresent 检查带注释的日期是现在还是将来 java.util.Date,java.util.Calendar,java.time.LocalDate等时间类型 高频
      @Future 检查带注释的日期是否是将来的日期 java.util.Date,java.util.Calendar,java.time.LocalDate等时间类型 高频
      @Email 检查指定的字符序列是否为有效的电子邮件地址。可选参数,regexp并flags允许指定电子邮件必须匹配的其他正则表达式(包括正则表达式标志) CharSequence 高频
      @Digits 检查带注释的值是否为最多由integer数字和fraction小数位组成的数字 BigDecimal的,BigInteger,CharSequence,byte,short,int,long和原始类型的相应的包装;Number基其子类型等 高频
      @DecimalMin 当inclusive= false 时,检查带注释的值是否大于指定的最小值。否则,该值是否大于或等于指定的最小值 BigDecimal的,BigInteger,CharSequence,byte,short,int,long和原始类型的相应的包装;Number基其子类型等 高频
      @DecimalMax inclusive= false 时,检查带注释的值是否小于指定的最大值。否则,该值是否小于或等于指定的最大值 BigDecimal的,BigInteger,CharSequence,byte,short,int,long和原始类型的相应的包装;Number基其子类型等 高频
      @AssertTrue 检查带注释的元素为true Boolean, boolean 高频
      @AssertFalse 检查带注释的元素为false Boolean, boolean 高频
      @Constraint 元注解,标识注解为约束注解,并指定验证器 注解 高频
      @ReportAsSingleViolation 元约束,违反所有约束,使用此约束
      @OverridesAttribute 覆写属性
      @GroupSequence 从新定义给的默认组
      @UnwrapByDefault 提取部分注解
      @ExtractedValue 校验提取值的类型
      @ConvertGroup 转换校验组 低频
      @ValidateOnExecution 指定配置源 在可执行文件或类型级别上使用注释
      @SupportedValidationTarget 区别交叉参数约束与返回值约束
    3. Hibernate Validator(若想查看此标准的官方文档点击此处)除了实现了bean规范中所有注解,还提供了一系列额外注解,在hibernate-validator.6.1.0.Final包下,包括:
      注解 注释 作用范围
      @URL 检查带注释的字符序列是否为有效URL CharSequence 高频
      @UniqueElements 检查带注释的集合仅包含唯一元素。使用该equals()方法确定相等性。 Collection 高频
      @SafeHtml 检查带注释的值是否包含潜在的恶意片段 CharSequence 高频
      @Range 检查带注释的值是否介于(包括)指定的最小值和最大值之间 BigDecimal,BigInteger,CharSequence,byte,short,int,long和原始类型的相应的包装 高频
      @Length 验证该注释字符序列是间min和max包含 CharSequence 高频
      @GroupSequenceProvider 根据对象状态动态定义校验组 注释在目标类中 低频
      @ConstraintComposition OR或者满足任何一个
      @Currency 检查带注释的货币单位javax.money.MonetaryAmount是否为指定货币单位的一部分 的任何子类型javax.money.MonetaryAmount
      @EAN 检查带注释的字符序列是有效的EAN条形码 CharSequence
      @CreditCardNumber 检查带注释的字符序列是否通过了Luhn校验和测试 CharSequence
      @ParameterScriptAssert 方法级别引用脚本约束 方法
      @ScriptAssert 检查是否可以根据带注释的元素成功评估给定脚本 任何类型
      @CodePointLength 验证带注释的字符序列的代码点长度在之间min并max包括在内 CharSequence
      @Mod11Check 检查带注释的字符序列中的数字是否通过了mod 11校验和算法 CharSequence
      @Mod10Check 检查带注释的字符序列中的数字是否通过通用mod 10校验和算法 CharSequence
      @LuhnCheck 检查带注释的字符序列中的数字是否通过Luhn校验和算法 CharSequence
      @ISBN 检查带注释的字符序列是有效的ISBN CharSequence
      @DurationMax 检查带注释的java.time.Duration元素不大于由注释参数构造的元素。如果将inclusiveflag设置为true,则允许平等 java.time.Duration
      @DurationMin 检查带注释的java.time.Duration元素不少于由注释参数构造的元素。如果将inclusiveflag设置为true,则允许平等 java.time.Duration
      @NIP 检查带注释的字符序列是否代表波兰增值税标识号 CharSequence
      @PESEL 检查带注释的字符序列是否代表波兰的国家标识号 CharSequence
      @REGON 检查带注释的字符序列是否表示波兰纳税人识别码 CharSequence
      @TituloEleitoral 检查带注释的字符序列是否代表巴西选民身份证号 CharSequence
      @CPF 检查带注释的字符序列是否代表巴西个人纳税人注册号 CharSequence
      @CNPJ 检查带注释的字符序列是否代表巴西公司纳税人注册编号 CharSequence

3.总结

zhangfeng

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: