成华区微信网站建,设计公司加盟,厦门工程建设招聘信息网站,北京网站建设学习首发博客地址 https://blog.zysicyj.top/ 一、声明bean约束 1. 字段级别约束 不支持静态类型字段 验证引擎直接访问实例变量#xff0c;不会调用属性的访问器 在验证字节码增强的对象时#xff0c;应适用属性级别约束#xff0c;因为字节码增库无法通过反射确定字段访问 pac… 首发博客地址 https://blog.zysicyj.top/ 一、声明bean约束 1. 字段级别约束 不支持静态类型字段 验证引擎直接访问实例变量不会调用属性的访问器 在验证字节码增强的对象时应适用属性级别约束因为字节码增库无法通过反射确定字段访问 package org.hibernate.validator.referenceguide.chapter02.fieldlevel;public class Car { NotNull private String manufacturer; AssertTrue private boolean isRegistered; public Car(String manufacturer, boolean isRegistered) { this.manufacturer manufacturer; this.isRegistered isRegistered; } //getters and setters...} 2. 属性级别约束 必须注释getter而不是setter这样可以限制没有设置方法的只读属性 该级别将使用属性访问策略来访问验证的值即验证引擎通过属性访问器来访问数据 不要字段和getter都加校验这样会导致校验两次 package org.hibernate.validator.referenceguide.chapter02.propertylevel;public class Car { private String manufacturer; private boolean isRegistered; public Car(String manufacturer, boolean isRegistered) { this.manufacturer manufacturer; this.isRegistered isRegistered; } NotNull public String getManufacturer() { return manufacturer; } public void setManufacturer(String manufacturer) { this.manufacturer manufacturer; } AssertTrue public boolean isRegistered() { return isRegistered; } public void setRegistered(boolean isRegistered) { this.isRegistered isRegistered; }} 容器元素约束 3.1 Iterable 在该类型上加约束时将会校验每个元素 package org.hibernate.validator.referenceguide.chapter02.containerelement.set;import java.util.HashSet;import java.util.Set;public class Car { private SetValidPart String parts new HashSet(); public void addPart(String part) { parts.add( part ); } //...} Car car new Car();car.addPart( Wheel );car.addPart( null );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( null is not a valid car part., constraintViolation.getMessage());assertEquals( parts[].iterable element, constraintViolation.getPropertyPath().toString() ); 3.2 List 也会校验每个元素 package org.hibernate.validator.referenceguide.chapter02.containerelement.list;public class Car { private ListValidPart String parts new ArrayList(); public void addPart(String part) { parts.add( part ); } //...} Car car new Car();car.addPart( Wheel );car.addPart( null );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( null is not a valid car part., constraintViolation.getMessage());assertEquals( parts[1].list element, constraintViolation.getPropertyPath().toString() ); 3.3 Map package org.hibernate.validator.referenceguide.chapter02.containerelement.map;import java.util.HashMap;import java.util.Map;import javax.validation.constraints.NotNull;public class Car { public enum FuelConsumption { CITY, HIGHWAY } private MapNotNull FuelConsumption, MaxAllowedFuelConsumption Integer fuelConsumption new HashMap(); public void setFuelConsumption(FuelConsumption consumption, int value) { fuelConsumption.put( consumption, value ); } //...} Car car new Car();car.setFuelConsumption( Car.FuelConsumption.HIGHWAY, 20 );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( 20 is outside the max fuel consumption., constraintViolation.getMessage());assertEquals( fuelConsumption[HIGHWAY].map value, constraintViolation.getPropertyPath().toString()); Car car new Car();car.setFuelConsumption( null, 5 );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( must not be null, constraintViolation.getMessage());assertEquals( fuelConsumptionK[].map key, constraintViolation.getPropertyPath().toString()); 3.4 Optional package org.hibernate.validator.referenceguide.chapter02.containerelement.optional;public class Car { private OptionalMinTowingCapacity(1000) Integer towingCapacity Optional.empty(); public void setTowingCapacity(Integer alias) { towingCapacity Optional.of( alias ); } //...} Car car new Car();car.setTowingCapacity( 100 );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( Not enough towing capacity., constraintViolation.getMessage());assertEquals( towingCapacity, constraintViolation.getPropertyPath().toString()); 3.5 自定义容器 package org.hibernate.validator.referenceguide.chapter02.containerelement.custom;public class Car { private GearBoxMinTorque(100) Gear gearBox; public void setGearBox(GearBoxGear gearBox) { this.gearBox gearBox; } //...} package org.hibernate.validator.referenceguide.chapter02.containerelement.custom;public class GearBoxT extends Gear { private final T gear; public GearBox(T gear) { this.gear gear; } public Gear getGear() { return this.gear; }} package org.hibernate.validator.referenceguide.chapter02.containerelement.custom;public class Gear { private final Integer torque; public Gear(Integer torque) { this.torque torque; } public Integer getTorque() { return torque; } public static class AcmeGear extends Gear { public AcmeGear() { super( 60 ); } }} package org.hibernate.validator.referenceguide.chapter02.containerelement.custom;public class GearBoxValueExtractor implements ValueExtractorGearBoxExtractedValue ? { Override public void extractValues(GearBoxExtractedValue ? originalValue, ValueExtractor.ValueReceiver receiver) { receiver.value( null, originalValue.getGear() ); }} Car car new Car();car.setGearBox( new GearBox( new Gear.AcmeGear() ) );SetConstraintViolationCar constraintViolations validator.validate( car );assertEquals( 1, constraintViolations.size() );ConstraintViolationCar constraintViolation constraintViolations.iterator().next();assertEquals( Gear is not providing enough torque., constraintViolation.getMessage());assertEquals( gearBox, constraintViolation.getPropertyPath().toString()); 3.6 嵌套容器元素 package org.hibernate.validator.referenceguide.chapter02.containerelement.nested;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.validation.constraints.NotNull;public class Car { private MapNotNull Part, ListNotNull Manufacturer partManufacturers new HashMap(); //...} 4. 类级别约束 在这种情况下验证的对象不是单个属性而是完整的对象 适合依赖于对象的多个属性之间的相关性很高的场景 package org.hibernate.validator.referenceguide.chapter02.classlevel;ValidPassengerCountpublic class Car { private int seatCount; private ListPerson passengers; //...} 5. 约束继承 在一个类实现接口或扩展另一个类时在超类上声明的所有约束注释都以与该类本身上指定的约束相同的方式约束 package org.hibernate.validator.referenceguide.chapter02.inheritance;public class Car { private String manufacturer; NotNull public String getManufacturer() { return manufacturer; } //...} package org.hibernate.validator.referenceguide.chapter02.inheritance;public class RentalCar extends Car { private String rentalStation; NotNull public String getRentalStation() { return rentalStation; } //...} RentalCar 不仅会校验getRentalStation而且会校验父类的getManufacturer 若继承换成接口也是会校验超类的 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 ListNotNull Valid Person passengers new ArrayListPerson(); private MapValid Part, ListValid 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 - 正在验证的根Beancom.bm.validate.Car7c83dc97 如果是bean约束则将约束应用到bean实例如果是属性约束则是托管该约束的属性的bean实例 09:35:00.446 [main] INFO com.bm.validate.TestValidatorBean - 如果是bean约束则将约束应用到bean实例如果是属性约束则是托管该约束的属性的bean实例com.bm.validate.Car7c83dc97 「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{annotationj.v.c.AssertTrue, payloads[], hasComposingConstraintstrue, isReportAsSingleInvalidConstraintfalse, elementTypeFIELD, definedOnDEFINED_LOCALLY, groups[interface javax.validation.groups.Default], attributes{groups[Ljava.lang.Class;60015ef5, message{javax.validation.constraints.AssertTrue.message}, payload[Ljava.lang.Class;2f54a33d}, constraintTypeGENERIC, valueUnwrappingDEFAULT} 三、内置约束 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.Datejava.util.Calendarjava.time.Instantjava.time.LocalDatejava.time.LocalDateTimejava.time.LocalTimejava.time.MonthDayjava.time.OffsetDateTimejava.time.OffsetTimejava.time.Yearjava.time.YearMonthjava.time.ZonedDateTimejava.time.chrono.HijrahDatejava.time.chrono.JapaneseDatejava.time.chrono.MinguoDatejava.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API 则由HV额外支持ReadablePartial和的任何实现ReadableInstant FutureOnPresent 检查日期是先在还是将来 java.util.Datejava.util.Calendarjava.time.Instantjava.time.LocalDatejava.time.LocalDateTimejava.time.LocalTimejava.time.MonthDayjava.time.OffsetDateTimejava.time.OffsetTimejava.time.Yearjava.time.YearMonthjava.time.ZonedDateTimejava.time.chrono.HijrahDatejava.time.chrono.JapaneseDatejava.time.chrono.MinguoDatejava.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API 则由HV额外支持ReadablePartial和的任何实现ReadableInstant Max(value) 是否小于或等于该值 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount Min(value) 是否大于或等于该值 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount NotBlank 指定字符不为null并且长度大于0 CharSequence NotEmpty 指定字符不为null或为空去除尾随空格 CharSequenceCollectionMap和数组 NotNull 检查注释的值不为null 所有类型均支持 Negative 检查元素是否严格为负零被视为无效 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount NegativeOrZero 检查元素是负数或0 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount Null 检查注释的值是null 所有类型均支持 Past 检查带注释的日期是否是过去的日期 java.util.Datejava.util.Calendarjava.time.Instantjava.time.LocalDatejava.time.LocalDateTimejava.time.LocalTimejava.time.MonthDayjava.time.OffsetDateTimejava.time.OffsetTimejava.time.Yearjava.time.YearMonthjava.time.ZonedDateTimejava.time.chrono.HijrahDatejava.time.chrono.JapaneseDatejava.time.chrono.MinguoDatejava.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API 则由HV附加支持ReadablePartial和的任何实现ReadableInstant PastOrPresent 检查带注释的日期是过去还是现在 java.util.Datejava.util.Calendarjava.time.Instantjava.time.LocalDatejava.time.LocalDateTimejava.time.LocalTimejava.time.MonthDayjava.time.OffsetDateTimejava.time.OffsetTimejava.time.Yearjava.time.YearMonthjava.time.ZonedDateTimejava.time.chrono.HijrahDatejava.time.chrono.JapaneseDatejava.time.chrono.MinguoDatejava.time.chrono.ThaiBuddhistDate; 如果类路径上有Joda Time日期/时间API 则由HV附加支持ReadablePartial和的任何实现ReadableInstant Pattern(regex, flags) regex考虑给定标志检查带注释的字符串是否与正则表达式匹配match CharSequence Positive 检查元素是否严格为正。零值被视为无效 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount PositiveOrZero 检查元素是否严格为正或零 BigDecimalBigIntegerbyteshortintlong和原始类型的相应的包装; HV额外支持的任何子类型CharSequence评估字符序列表示的数值Number和的任何子类型javax.money.MonetaryAmount Size(min, max) 检查带注释的元素的大小是否介于min和之间max包括 CharSequenceCollectionMap和数组 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) 检查带注释的值是否介于包括指定的最小值和最大值之间 BigDecimalBigIntegerCharSequencebyteshortintlong和原始类型的相应的包装 UniqueElements 检查带注释的集合仅包含唯一元素。使用该equals()方法确定相等性。默认消息不包括重复元素的列表但是您可以通过覆盖消息并使用{duplicates}message参数来包括它。重复元素的列表也包含在约束违反的动态有效负载中。 Collection负载中。 Collection 本文由 mdnice 多平台发布