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

简介: 【hibernate validator】(二)声明和验证Bean约束(下)

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;
    //...
}
  1. 校验Person的名字是否存在为null的
  2. 校验Part的名字是否存在为null的
  3. 校验所有的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任意子类

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

本文由 mdnice 多平台发布


相关文章
|
Java 数据库连接
【hibernate validator】(五)分组约束
【hibernate validator】(五)分组约束
|
Java 数据库连接
hibernate validator】(三)声明和验证方法约束
hibernate validator】(三)声明和验证方法约束
|
安全 Java 数据库连接
【hibernate validator】(四)内插约束错误消息
【hibernate validator】(四)内插约束错误消息
|
Java 数据库连接 容器
【hibernate validator】(二)声明和验证Bean约束(上)
【hibernate validator】(二)声明和验证Bean约束
|
Java 数据库连接
【hibernate validator】(六)创建自定义约束
【hibernate validator】(六)创建自定义约束
|
Oracle 关系型数据库 Java
hibernate操作Oracle出现违反唯一约束条件
出现这个问题的原因无非是主键冲突,我这里引起主键冲突的原因是实体类使用的ID策略为
|
前端开发 Java 数据库连接
Hibernate Validator -- 伟大的校验器
validator Engine 是支持Javax.validator 的接口的实现, 并且可以通过一些简单的标注的形式(annotation形式)实现一个校验的形式, 它其实也是一个约定大于执行的过程
159 0
|
6月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
21天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
12 1
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
47 1