我很高兴宣布 Hibernate Validator 4.2 的首个Beta版本。您可以从 JBoss Maven 仓库 或从 SourceForge 下载此版本。
如之前宣布的 的那样,4.2 版本的亮点是实现方法级约束(HV-347),这如 Bean Validation 规范附录C中所述。非常感谢 Gunnar 实现了这个新功能。方法级验证允许将约束应用于方法参数或返回值,如下所示
public @NotNull String saveItem(@Valid @NotNull Item item, @Max(23) BigDecimal price)要验证这些约束,您需要通过 Validator.unwrap() 方法获取一个 MethodValidator
MethodValidator validator = Validation.byProvider( HibernateValidator.class ) .configure() .buildValidatorFactory() .getValidator() .unwrap( MethodValidator.class );并使用此新接口的以下方法之一
public interface MethodValidator { public <T> Set<MethodConstraintViolation<T>> validateParameter(T object, Method method, Object parameterValue, int parameterIndex, Class<?>... groups); public <T> Set<MethodConstraintViolation<T>> validateParameters(T object, Method method, Object[] parameterValues, Class<?>... groups); public <T> Set<MethodConstraintViolation<T>> validateReturnValue(T object, Method method, Object returnValue, Class<?>... groups); }返回的 MethodConstraintViolation 是从 ConstraintViolation 派生出来的,并提供了方法级验证特定信息。例如,它可以包含导致约束违反的方法名称和参数索引。此功能的文档仍在进行中,将在后续版本中完成。
我们预计新的 MethodValidator API 与 Contexts and Dependency Injection (JSR-299) 或面向方面的框架等 API 或框架结合使用时特别有趣。借助这些框架,创建一个拦截器/方面以自动触发所有方法调用的验证并在发生任何验证错误时抛出 MethodConstraintViolationExcepion 非常简单。让我们知道您将如何使用此新 API。
除了方法级验证之外,我们还引入了布尔组合约束(HV-390)。迄今为止,组合约束始终是所有指定约束的合取。在这个版本中,Hibernate Validator 引入了 @ConstraintComposition 注解和 CompositionType 枚举。这允许您定义如下组合约束
@ConstraintComposition(OR) @Pattern(regexp = "K") @Size(min = 2, max = 10) @ReportAsSingleViolation @Target({ METHOD, FIELD }) @Retention(RUNTIME) @Constraint(validatedBy = { }) public @interface PatternOrSize { public abstract String message() default "OR"; public abstract Class<?>[] groups() default { }; public abstract Class<? extends Payload>[] payload() default { }; }这是社区又一个贡献。非常感谢您的支持 :)
另一个值得注意的新特性是新的 ValueFormatterMessageInterpolator,它允许您在消息模板中对验证值进行插值。要启用此新插值器,请使用配置API。
Validation.byProvider( HibernateValidator.class ).configure().messageInterpolator( new ValueFormatterMessageInterpolator() ).buildValidatorFactory();使用消息参数 validatedValue 和可选的 格式字符串,您可以插值验证值。例如,考虑一个自定义的 @Future 约束消息 - "${validatedValue:%1$td.%1$tm.%1$ty} is not in the future",它将插值成类似 "13.01.11 is not in the future" 的内容。
关于向后兼容性的一点说明。由于 BVTCK-12 resp. HV-395,Hibernate Validator 的 javax.validation.Path 实现需要一些更改。不过,好消息是,除非您遍历 Path 实例(由 Constraint.getPropertyPath() 返回),否则您不会受到此更改的影响。
此外,泛型约束的程序化配置也有所改变,现在看起来是这样的
ConstraintMapping mapping = new ConstraintMapping(); mapping.type( Foo.class ) .property( "bar", FIELD ) .genericConstraint( MyConstraint.class ).param( "value", 1 );我们还向 ConstraintDef 添加了一个新的类型参数,这简化了自定义约束定义类型的创建。现在不再需要提供标准约束属性的方法,如 message()。如果您使用自定义 ConstraintDef,您将需要对您的实现进行更新。
当然,此版本也包含了一系列其他错误修复和改进。您可以在 此处 查看完整的变更日志。感谢 Kevin,他帮助修复了许多这些问题。为了指出他的贡献之一,请查看 HV-307,该功能添加了对 Joda Time 类型(如 DateTime)的支持。这些类型可以像标准 JDK 日期类型一样使用 @Past 和 @Future 注解。
我们期待您对 Validator 论坛 的反馈。对于错误报告,请使用 问题跟踪器。