常用约束注解解释
本来这个不用写的,但是为了保证系列文章的完整性,还是总结如下
说明:我的总结比绝大多数文章都会详细点,因此看此一篇就够了
所有的约束注解都是可以重复标记的,因为它身上都有如下重复标记的标注:
@Repeatable(List.class)
说明:
- @DecimalMax和@Max的区别:1. @DecimalMax支持类型:Number、BidDecimal、Float、Double、BigInteger、Long2. @Max支持的类型:同上3. 它俩都还能标注在String上,比如“6”这种字符串。(若你不是数字字符串,永远校验不通过)
- 所有没有特殊说明的:null is valid
- 若在不支持的类型上使用约束注解,运行时抛出异常:javax.validation.UnexpectedTypeException:No validator could be found for constraint ‘javax.validation.constraints.Future’ validating type ‘java.lang.String’
- @FutureOrPresent和@PastOrPresent这块注意:对于Present的匹配,要注意程序是有执行时间的。so如果是匹配时间戳Instant,若是Instant.now()的话,@FutureOrPresent就是非法的,而@PastOrPresent就成合法的了。但是若是日期的话比如LocalDate.now()就不会有这问题,毕竟你的程序不可能执行一天嘛~~~~
- @NotNull:有的人问用在基本类型(非包装类型报错吗?),很显然不会报错。因为基本类型都有默认值,不可能为null的
- 所有的注解都能标注在:字段、方法、构造器、入参、以及注解上
JSR的注解都申明都非常的简单,没有Hibernate提供的复杂,比如没有用到@ReportAsSingleViolation等注解内容~为了方面,下面列出各个注解的默认提示消息( 中文):
javax.validation.constraints.AssertFalse.message = 只能为false javax.validation.constraints.AssertTrue.message = 只能为true javax.validation.constraints.DecimalMax.message = 必须小于或等于{value} javax.validation.constraints.DecimalMin.message = 必须大于或等于{value} javax.validation.constraints.Digits.message = 数字的值超出了允许范围(只允许在{integer}位整数和{fraction}位小数范围内) javax.validation.constraints.Email.message = 不是一个合法的电子邮件地址 javax.validation.constraints.Future.message = 需要是一个将来的时间 javax.validation.constraints.FutureOrPresent.message = 需要是一个将来或现在的时间 javax.validation.constraints.Max.message = 最大不能超过{value} javax.validation.constraints.Min.message = 最小不能小于{value} javax.validation.constraints.Negative.message = 必须是负数 javax.validation.constraints.NegativeOrZero.message = 必须是负数或零 javax.validation.constraints.NotBlank.message = 不能为空 javax.validation.constraints.NotEmpty.message = 不能为空 javax.validation.constraints.NotNull.message = 不能为null javax.validation.constraints.Null.message = 必须为null javax.validation.constraints.Past.message = 需要是一个过去的时间 javax.validation.constraints.PastOrPresent.message = 需要是一个过去或现在的时间 javax.validation.constraints.Pattern.message = 需要匹配正则表达式"{regexp}" javax.validation.constraints.Positive.message = 必须是正数 javax.validation.constraints.PositiveOrZero.message = 必须是正数或零 javax.validation.constraints.Size.message = 个数必须在{min}和{max}之间
参考文件ValidationMessages_zh_CN.properties
,若消息不适合你,可自行定制~
说明:
- @ReportAsSingleViolation:如果@NotEmpty、@Pattern都校验失败,不添加此注解,则会生成两个校验失败的结果。若添加了此注解,那错误消息以它标注的本注解的message为准
- 所有没有特殊说明的:null is valid。
- 所有约束注解都可重复标注
各个注解的默认提示消息(中文):
org.hibernate.validator.constraints.CreditCardNumber.message = 不合法的信用卡号码 org.hibernate.validator.constraints.Currency.message = 不合法的货币 (必须是{value}其中之一) org.hibernate.validator.constraints.EAN.message = 不合法的{type}条形码 org.hibernate.validator.constraints.Email.message = 不是一个合法的电子邮件地址 org.hibernate.validator.constraints.Length.message = 长度需要在{min}和{max}之间 org.hibernate.validator.constraints.CodePointLength.message = 长度需要在{min}和{max}之间 org.hibernate.validator.constraints.LuhnCheck.message = ${validatedValue}的校验码不合法, Luhn模10校验和不匹配 org.hibernate.validator.constraints.Mod10Check.message = ${validatedValue}的校验码不合法, 模10校验和不匹配 org.hibernate.validator.constraints.Mod11Check.message = ${validatedValue}的校验码不合法, 模11校验和不匹配 org.hibernate.validator.constraints.ModCheck.message = ${validatedValue}的校验码不合法, ${modType}校验和不匹配 org.hibernate.validator.constraints.NotBlank.message = 不能为空 org.hibernate.validator.constraints.NotEmpty.message = 不能为空 org.hibernate.validator.constraints.ParametersScriptAssert.message = 执行脚本表达式"{script}"没有返回期望结果 org.hibernate.validator.constraints.Range.message = 需要在{min}和{max}之间 org.hibernate.validator.constraints.SafeHtml.message = 可能有不安全的HTML内容 org.hibernate.validator.constraints.ScriptAssert.message = 执行脚本表达式"{script}"没有返回期望结果 org.hibernate.validator.constraints.URL.message = 需要是一个合法的URL
此处用到了${validatedValue}、${modType}是EL表达式的语法。
@DurationMax和@DurationMin的message消息此处未贴出,有大量的EL计算,太长了~~~
总结
本文值得说是深入了解数据校验(Bean Validation)了,对于数据校验的基本使用一直都不是难事,特别是在Spring环境下使用就更简单了~