我们并不经常宣布 Hibernate Validator 的新版本发布。但今天就是这样的日子:Hibernate Validator 6 的第一个 alpha 版本刚刚发布。

Hibernate Validator 6 将成为 Bean Validation 2.0 的参考实现。这就是为什么我们协调了这两个项目的第一个 alpha 版本发布。

它也是一个用于验证 Bean Validation 规范未来增强的游乐场,因此非常欢迎对这里提出的主题提供反馈!

注意,Hibernate Validator 6 需要 JDK 8 或更高版本。

新增功能

新的 group id

首先,从 6 版本开始,Hibernate Validator 的新家是 org.hibernate.validator(它曾是 org.hibernate)。

例如,这个版本的 Maven 坐标为

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.0.Alpha1</version>
</dependency>

我们发布了迁移工件,以便过渡更加平滑。检查您的构建输出,如果您看到类似 "[WARNING] The artifact org.hibernate:hibernate-validator:jar:6.0.0.Alpha1 has been relocated to org.hibernate.validator:hibernate-validator:jar:6.0.0.Alpha1" 的消息,您仍在使用旧的 GAV 坐标,应该升级到新的坐标。

同时,请确保不要同时依赖 5.x 和 6.x(因为组 ID 不同,您的构建工具的依赖关系解析算法无法检测到这是同一逻辑工件的两个版本)。

Java 8 优点

由于我们现在针对 Java 8 及以上版本,我们可以享受语言改进的好处

  • 所有 Bean Validation 和 Hibernate Validator 约束都可以在类型使用上下文中使用(例如 List<@NotBlank String>);

  • 现在所有可以与 List 容器重复的注解都被标记为 @Repeatable

实现规范的新功能

本周早些时候,Gunnar 在 Bean Validation 网站上介绍了 Bean Validation 2.0 早期草案 1 中引入的新功能,详情请见 Bean Validation 2.0 早期草案 1 新特性。这些新功能已在 Hibernate Validator 6.0.0.Alpha1 中实现,因此您现在可以尝试使用它们并给我们提供反馈。

嵌套类型使用约束和嵌套级联验证

在Hibernate Validator中,有一些功能超越了规范早期草案 1 的范围。

通常情况下,在Hibernate Validator中,类型使用约束可以应用于嵌套类型,级联验证也是如此。

public class Order {

        private Map<@NotNull @Valid Product, @Size(min = 1) List<@NotNull @Valid OrderLine>> lines;

}

在上面的示例中,Hibernate Validator将要执行以下操作:

  • 验证 Product 上的 @NotNull 约束;

  • 将验证级联到 Product;

  • 验证 Product 的 OrderLine 列表至少包含一个元素;

  • 验证列表中不包含任何 null 元素;

  • 将验证级联到 OrderLine;

如上所述,嵌套部分是Hibernate Validator中的新特性,目前尚未包含在规范中。如果您认为应该包含在内,请举手并表示参与 讨论。预计很快就会有关于嵌套类型验证中属性路径节点应如何表现的有趣讨论。

基于 Lambda 的约束定义

我们开始探索如何将 Lambda 集成到 Hibernate Validator 中,其第一个成果就是基于 Lambda 的约束定义。使用程序化 API,您可以在不编写 ConstraintValidator 的情况下定义约束。

HibernateValidatorConfiguration configuration = Validation
    .byProvider( HibernateValidator.class )
    .configure();

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
    .constraintDefinition( ValidPassengerCount.class )
        .validateType( Bus.class )
            .with( b -> b.getSeatCount() >= b.getPassengers().size() );

请注意,程序化 API 不是规范的一部分,因此目前这部分仅限于我们的实现。

对 Duration 的验证

在 Hibernate Validator 6 中,我们能够验证更多的 java.time 类,最近 Marko 引入了对 Duration 的支持。

以下是一个使用该功能的示例

public class TrainingSession {
    [...]

    @DurationMin(hours = 1, minutes = 30)
    @DurationMax(days = 1, inclusive = false)
    private Duration duration;

    [...]
}

如果您认为此功能应纳入规范,请告诉我们。

获取 6.0.0.Alpha1

要使用 Maven、Gradle 等工具获取发行版,请使用 GAV 坐标 org.hibernate.validator:{hibernate-validator|hibernate-validator-cdi|hibernate-validator-annotation-processor}:6.0.0.Alpha1。如前所述,组 ID 已更改为 org.hibernate.validator

或者,可以在 SourceForge 上找到包含所有内容的发行版包(TAR.GZZIP)。

反馈、问题、想法?

要取得联系,请使用以下常规渠道

接下来是什么?

Bean Validation 2.0 和 Hibernate Validator 6 仍在积极开发中。我们将定期发布新的 alpha 版本。


返回顶部