首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【hibernate validator】(二)声明和验证Bean约束

首发博客地址

https://blog.zysicyj.top/

一、声明bean约束

1. 字段级别约束

不支持静态类型字段

验证引擎直接访问实例变量,不会调用属性的访问器

在验证字节码增强的对象时,应适用属性级别约束,因为字节码增库无法通过反射确定字段访问

2. 属性级别约束

必须注释getter而不是setter,这样可以限制没有设置方法的只读属性

该级别将使用属性访问策略来访问验证的值,即验证引擎通过属性访问器来访问数据

不要字段和getter都加校验,这样会导致校验两次

容器元素约束

3.1 Iterable

在该类型上加约束时,将会校验每个元素

3.2 List

也会校验每个元素

3.3 Map

3.4 Optional

3.5 自定义容器

3.6 嵌套容器元素

4. 类级别约束

在这种情况下,验证的对象不是单个属性而是完整的对象

适合依赖于对象的多个属性之间的相关性很高的场景

5. 约束继承

在一个类实现接口或扩展另一个类时,在超类上声明的所有约束注释都以与该类本身上指定的约束相同的方式约束

RentalCar 不仅会校验getRentalStation,而且会校验父类的getManufacturer

若继承换成接口,也是会校验超类的

6. 对象图

不仅支持单个对象校验,还支持级联验证

对象的级联校验

在校验Car的时候,会校验Person,因此若Car引用的Person的name为空,则会校验失败

容器的级联校验

校验Person的名字是否存在为null的

校验Part的名字是否存在为null的

校验所有的Manufacturer是否存在名字为null的

二、验证Bean约束

1. 获取验证器

2. 验证的三种方式

先来个车

bean全部验证

验证单个属性

对属性的值进行验证

3. 约束违规

「内插的错误消息」

非插补的错误消息

正在验证的根Bean

如果是bean约束,则将约束应用到bean实例;如果是属性约束,则是托管该约束的属性的bean实例

「bean验证器值的属性路径」

**「报告约束失败的原数据」

「告约束失败的元数据」

三、内置约束

@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任意子类

@Email

是否为有效的电子邮箱地址

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()方法确定相等性。默认消息不包括重复元素的列表,但是您可以通过覆盖消息并使用message参数来包括它。重复元素的列表也包含在约束违反的动态有效负载中。

Collection��负载中。

Collection

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OY-CAajuFg0kpnWz_adrawgQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券