6. 对象图
不仅支持单个对象校验,还支持级联验证
对象的级联校验
package org.hibernate.validator.referenceguide.chapter02.objectgraph; public class Car { @NotNull @Valid private Person driver; //... }
package org.hibernate.validator.referenceguide.chapter02.objectgraph; public class Person { @NotNull private String name; //... }
在校验Car的时候,会校验Person,因此若Car引用的Person的name为空,则会校验失败
容器的级联校验
package org.hibernate.validator.referenceguide.chapter02.objectgraph.containerelement; public class Car { private List<@NotNull @Valid Person> passengers = new ArrayList<Person>(); private Map<@Valid Part, List<@Valid Manufacturer>> partManufacturers = new HashMap<>(); //... }
package org.hibernate.validator.referenceguide.chapter02.objectgraph.containerelement; public class Part { @NotNull private String name; //... }
package org.hibernate.validator.referenceguide.chapter02.objectgraph.containerelement; public class Manufacturer { @NotNull private String name; //... }
- 校验Person的名字是否存在为null的
- 校验Part的名字是否存在为null的
- 校验所有的Manufacturer是否存在名字为null的
二、验证Bean约束
1. 获取验证器
2. 验证的三种方式
先来个车
class Car { @NotNull @Size(min = 5,max = 20) private String manufacturer; @AssertTrue private boolean isRegistered; public Car(String manufacturer, boolean isRegistered) { this.manufacturer = manufacturer; this.isRegistered = isRegistered; } }
bean全部验证
验证单个属性
对属性的值进行验证
3. 约束违规
「内插的错误消息」
09:35:00.446 [main] INFO com.bm.validate.TestValidatorBean - 内插的错误消息:只能为true
非插补的错误消息
09:35:00.446 [main] INFO com.bm.validate.TestValidatorBean - 非插补的错误消息:{javax.validation.constraints.AssertTrue.message}
正在验证的根Bean
09:35:00.446 [main] INFO com.bm.validate.TestValidatorBean - 正在验证的根Bean:com.bm.validate.Car@7c83dc97
如果是bean约束,则将约束应用到bean实例;如果是属性约束,则是托管该约束的属性的bean实例
09:35:00.446 [main] INFO com.bm.validate.TestValidatorBean - 如果是bean约束,则将约束应用到bean实例;如果是属性约束,则是托管该约束的属性的bean实例:com.bm.validate.Car@7c83dc97
「bean验证器值的属性路径」
09:35:00.447 [main] INFO com.bm.validate.TestValidatorBean - 根bean验证器值的属性路径:isRegistered
**「报告约束失败的原数据」
09:35:00.447 [main] INFO com.bm.validate.TestValidatorBean - 报告约束失败的原数据:false
「告约束失败的元数据」
09:35:00.447 [main] INFO com.bm.validate.TestValidatorBean - 报告约束失败的元数据:ConstraintDescriptorImpl{annotation=j.v.c.AssertTrue, payloads=[], hasComposingConstraints=true, isReportAsSingleInvalidConstraint=false, elementType=FIELD, definedOn=DEFINED_LOCALLY, groups=[interface javax.validation.groups.Default], attributes={groups=[Ljava.lang.Class;@60015ef5, message={javax.validation.constraints.AssertTrue.message}, payload=[Ljava.lang.Class;@2f54a33d}, constraintType=GENERIC, valueUnwrapping=DEFAULT}
三、内置约束
@AssertFalse
检查带注释元素的属性为false
- Boolean, boolean
@AssertTrue
检查带注释元素的属性为True
- Boolean,boolean
@DecimalMax(value=, inclusive=)
- inclusive为false,检查带注释的值是否小于指定的最大值。否则,该值是否小于等于指定的最大值
- BigDecimal,BigInteger,CharSequence,byte,short,int,long,原始数据包装类,Number,javax.money.MonetaryAmount任意子类
@DecimalMin(value=, inclusive=)
- inclusive为false,检查带注释的值是否大于指定的最小值。否则,该值是否大于等于指定的最小值
- BigDecimal,BigInteger,CharSequence,byte,short,int,long,原始数据包装类,Number,javax.money.MonetaryAmount任意子类
@Digits(integer=, fraction=)
- integer 指定整数位数限制,fraction指定小数位数限制
- BigDecimal,BigInteger,CharSequence,byte,short,int,long,原始数据包装类,Number,javax.money.MonetaryAmount任意子类
- 是否为有效的电子邮箱地址
- regexp和flags参数指定正则规则,必须匹配的其它表达式
- CharSequence
@Future
- 检查是否是将来的日期
- java.util.Date,java.util.Calendar,java.time.Instant,java.time.LocalDate,java.time.LocalDateTime,java.time.LocalTime,java.time.MonthDay,java.time.OffsetDateTime,java.time.OffsetTime,java.time.Year,java.time.YearMonth,java.time.ZonedDateTime,java.time.chrono.HijrahDate,java.time.chrono.JapaneseDate,java.time.chrono.MinguoDate,java.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API ,则由HV额外支持:ReadablePartial和的任何实现ReadableInstant
@FutureOnPresent
- 检查日期是先在还是将来
- java.util.Date,java.util.Calendar,java.time.Instant,java.time.LocalDate,java.time.LocalDateTime,java.time.LocalTime,java.time.MonthDay,java.time.OffsetDateTime,java.time.OffsetTime,java.time.Year,java.time.YearMonth,java.time.ZonedDateTime,java.time.chrono.HijrahDate,java.time.chrono.JapaneseDate,java.time.chrono.MinguoDate,java.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API ,则由HV额外支持:ReadablePartial和的任何实现ReadableInstant
@Max(value=)
- 是否小于或等于该值
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@Min(value=)
- 是否大于或等于该值
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@NotBlank
- 指定字符不为null并且长度大于0
- CharSequence
@NotEmpty
- 指定字符不为null或为空(去除尾随空格)
- CharSequence,Collection,Map和数组
@NotNull
- 检查注释的值不为null
- 所有类型均支持
@Negative
- 检查元素是否严格为负,零被视为无效
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@NegativeOrZero
- 检查元素是负数或0
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@Null
- 检查注释的值是null
- 所有类型均支持
@Past
- 检查带注释的日期是否是过去的日期
- java.util.Date,java.util.Calendar,java.time.Instant,java.time.LocalDate,java.time.LocalDateTime,java.time.LocalTime,java.time.MonthDay,java.time.OffsetDateTime,java.time.OffsetTime,java.time.Year,java.time.YearMonth,java.time.ZonedDateTime,java.time.chrono.HijrahDate,java.time.chrono.JapaneseDate,java.time.chrono.MinguoDate,java.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API ,则由HV附加支持:ReadablePartial和的任何实现ReadableInstant
@PastOrPresent
- 检查带注释的日期是过去还是现在
- java.util.Date,java.util.Calendar,java.time.Instant,java.time.LocalDate,java.time.LocalDateTime,java.time.LocalTime,java.time.MonthDay,java.time.OffsetDateTime,java.time.OffsetTime,java.time.Year,java.time.YearMonth,java.time.ZonedDateTime,java.time.chrono.HijrahDate,java.time.chrono.JapaneseDate,java.time.chrono.MinguoDate,java.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API ,则由HV附加支持:ReadablePartial和的任何实现ReadableInstant
@Pattern(regex=, flags=)
- regex考虑给定标志,检查带注释的字符串是否与正则表达式匹配match
- CharSequence
@Positive
- 检查元素是否严格为正。零值被视为无效
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@PositiveOrZero
- 检查元素是否严格为正或零
- BigDecimal,BigInteger,byte,short,int,long和原始类型的相应的包装; HV额外支持:的任何子类型CharSequence(评估字符序列表示的数值),Number和的任何子类型javax.money.MonetaryAmount
@Size(min=, max=)
- 检查带注释的元素的大小是否介于min和之间max(包括)
- CharSequence,Collection,Map和数组
@CreditCardNumber(ignoreNonDigitCharacters=)
- 检查带注释的字符序列是否通过了Luhn校验和测试
- ignoreNonDigitCharacters允许忽略非数字字符。默认值为false。
- CharSequence
@Currency(value=)
- 检查带注释的货币单位javax.money.MonetaryAmount是否为指定货币单位的一部分。
- javax.money.MonetaryAmount
@DurationMax(days=, hours=, minutes=, seconds=, millis=, nanos=, inclusive=)
- 检查带注释的java.time.Duration元素不大于由注释参数构造的元素。如果将inclusiveflag设置为,则允许平等true
- java.time.Duration
@DurationMin(days=, hours=, minutes=, seconds=, millis=, nanos=, inclusive=)
- 检查带注释的java.time.Duration元素不少于由注释参数构造的元素。如果将inclusiveflag设置为,则允许平等true。
- java.time.Duration
@EAN
- 检查带注释的字符序列是有效的EAN条形码。类型决定条形码的类型
- CharSequence
@ISBN
- 检查带注释的字符序列是有效的ISBN
- CharSequence
@Length(min=, max=)
- 验证该注释字符序列是间min和max包含
- CharSequence
@Range(min=, max=)
- 检查带注释的值是否介于(包括)指定的最小值和最大值之间
- BigDecimal,BigInteger,CharSequence,byte,short,int,long和原始类型的相应的包装
@UniqueElements
- 检查带注释的集合仅包含唯一元素。使用该equals()方法确定相等性。默认消息不包括重复元素的列表,但是您可以通过覆盖消息并使用{duplicates}message参数来包括它。重复元素的列表也包含在约束违反的动态有效负载中。
- Collection��负载中。
- Collection
本文由 mdnice 多平台发布