Hibernate Validator 4.1.0.Beta2 已发布。自上次发布以来,共解决了 29 个问题,您可以在 Jira 变更日志 中查看。在众多更新中,我们添加了 @ScriptAssert 约束,这是在之前的 发布博客 中承诺的。最初我们想直接发布 4.1.0.CR,但我们添加了一个新的程序性约束配置 API (HV-274),我们希望首先收集一些反馈。
新的 API 围绕 ConstraintMapping 展开,这是进入 流畅 API 的入口点,允许配置约束。API 与 Emmanuel 的博客中描述的类似 Hibernate Search 程序性映射 API。但让我们看看一个例子
ConstraintMapping mapping = new ConstraintMapping(); mapping.type( Car.class ) .property( "manufacturer", FIELD ) .constraint( NotNullDef.class ) .property( "licensePlate", FIELD ) .constraint( NotNullDef.class ) .constraint( SizeDef.class ) .min( 2 ) .max( 14 ) .property( "seatCount", FIELD ) .constraint( MinDef.class ) .value ( 2 ) .type( RentalCar.class ) .property( "rentalStation", METHOD) .constraint( NotNullDef.class );
如您所见,您可以通过方法链在多个类和属性上配置约束。约束定义类 NotNullDef、SizeDef 和 MinDef 是辅助类,允许以类型安全的方式配置约束参数。所有内置约束都在 org.hibernate.validator.cfg.defs 包中存在定义类。对于自定义约束,您可以选择创建自己的定义类,扩展 ConstraintDef,或者使用 GenericConstraintDef(我们还在考虑提供一个编译时可以生成所需辅助类的另一个注解处理器)
ConstraintMapping mapping = new ConstraintMapping(); mapping.type( Car.class ) .property( "licensePlate", FIELD ) .constraint( GenericConstraintDef.class ) .constraintType( CheckCase.class ) .param( "value", CaseMode.UPPER );
最后但同样重要的是,您还可以定义级联约束以及实体的默认组序列。
ConstraintMapping mapping = new ConstraintMapping(); mapping.type( Car.class ) .valid( "driver", FIELD ) .type( RentalCar.class) .defaultGroupSequence( RentalCar.class, CarChecks.class );
由于程序性配置不是官方 Bean Validation 规范的一部分,您必须在启动过程中获取 HibernateValidatorConfiguration 以设置您的 ConstraintMapping
HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure(); config.addMapping( mapping ); ValidatorFactory factory = config.buildValidatorFactory(); Validator validator = factory.getValidator();
您觉得呢?这个 API 有用吗?易于使用吗?我们还需要考虑/更改什么?
如果您想试用这个版本,您可以从JBoss Maven 仓库或从SourceForge下载。
祝您使用愉快!