SpringBoot Validation参数校验 详解自定义注解规则和分组校验

Hibernate Validator 是 Bean Validation 的参考实现 。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint
在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。

在SpringBoot中可以使用@Validated,注解Hibernate Validator加强版,也可以使用@Valid原来Bean Validation java版本

内置校验注解

Bean Validation 中内置的 constraint

注解 作用
@Valid   被注释的元素是一个对象,需要检查此对象的所有字段值  
@Null   被注释的元素必须为 null  
@NotNull   被注释的元素必须不为 null  
@AssertTrue   被注释的元素必须为 true  
@AssertFalse   被注释的元素必须为 false  
@Min(value)   被注释的元素必须是一个数字,其值必须大于等于指定的最小值  
@Max(value)   被注释的元素必须是一个数字,其值必须小于等于指定的最大值  
@DecimalMin(value)   被注释的元素必须是一个数字,其值必须大于等于指定的最小值  
@DecimalMax(value)   被注释的元素必须是一个数字,其值必须小于等于指定的最大值  
@Size(max, min)   被注释的元素的大小必须在指定的范围内  
@Digits (integer, fraction)   被注释的元素必须是一个数字,其值必须在可接受的范围内  
@Past   被注释的元素必须是一个过去的日期  
@Future   被注释的元素必须是一个将来的日期  
@Pattern(value)   被注释的元素必须符合指定的正则表达式  

Hibernate Validator 附加的 constraint

注解 作用
@Email   被注释的元素必须是电子邮箱地址  
@Length(min=, max=)   被注释的字符串的大小必须在指定的范围内  
@NotEmpty   被注释的字符串的必须非空  
@Range(min=, max=)   被注释的元素必须在合适的范围内  
@NotBlank   被注释的字符串的必须非空  
@URL(protocol=,host=, port=, regexp=, flags=)   被注释的字符串必须是一个有效的url  
@CreditCardNumber   被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性  
@ScriptAssert(lang=, script=, alias=)   要有Java Scripting API 即JSR 223("Scripting for the JavaTM Platform")的实现  
@SafeHtml(whitelistType=,additionalTags=)   classpath中要有jsoup包  

message支持表达式和EL表达式 ,比如message = "姓名长度限制为{min}到{max} ${1+2}")

想把错误描述统一写到properties的话,在classpath下面新建ValidationMessages_zh_CN.properties文件(注意value需要转换为unicode编码),然后用{}格式的占位符

hibernate补充的注解中,最后3个不常用,可忽略。
主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:

@NotNull 任何对象的value不能为null

@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null

@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0

分组校验

如果同一个参数,需要在不同场景下应用不同的校验规则,就需要用到分组校验了。比如:新注册用户还没起名字,我们允许name字段为空,但是在更新时候不允许将名字更新为空字符。

分组校验有三个步骤:

定义一个分组类(或接口)

public interface Update extends Default{ }

在校验注解上添加groups属性指定分组

public class UserVO { @NotBlank(message = "name 不能为空",groups = Update.class) private String name; // 省略其他代码... }

Controller方法的@Validated注解添加分组类

@PostMapping("update") public ResultInfo update(@Validated({Update.class}) UserVO userVO) { return new ResultInfo().success(userVO); }

自定义的Update分组接口继承了Default接口。校验注解(如: @NotBlank)和@validated默认其他注解都属于Default.class分组,这一点在javax.validation.groups.Default注释中有说明

/** * Default Jakarta Bean Validation group. * <p> * Unless a list of groups is explicitly defined: * <ul> * <li>constraints belong to the {@code Default} group</li> * <li>validation applies to the {@code Default} group</li> * </ul> * Most structural constraints should belong to the default group. * * @author Emmanuel Bernard */ public interface Default { }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwzxz.html