Hibernate Validator

迁移指南

此页面包含您从一个 Hibernate Validator 版本升级到另一个版本时需要了解的一切。

9.0.x

9.0.0.Beta2

升级

移除

  • 随着 java.lang.SecurityManager弃用并即将移除,并且一段时间以来没有替代方案,现在是时候从 Hibernate Validator 中移除 Security Manager 集成。从这个版本开始,Hibernate Validator 将不再考虑 Security Manager 规则。

  • Hibernate Validator 停止发布一些之前发布的模块。其中大多数模块不应被最终用户使用。以下是模块列表,以及它们未发布的原因:

    • hibernate-validator-modules:在最新的 WildFly 版本中,这种修补服务器的方法不再可用。虽然存在其他方法,但 Hibernate Validator 目前不会提供在 WildFly 中修补验证模块的功能。

    • hibernate-validator-performance:一组对最终用户没有价值的性能测试。

    • hibernate-validator-build-config:编译/打包工件所需的构建配置,但对最终用户没有价值。

    • hibernate-validator-tck-runner:一个测试工具,帮助运行 Jakarta Validation TCK,对最终用户没有价值。

    • hibernate-validator-integrationtest-wildfly:一组对最终用户没有价值的测试。

    • hibernate-validator-parent:随着发布的工件扁平化了 pom 文件,发布父 POM 现在不再需要。

    • hibernate-validator-documentation:文档发布到 文档页面

    • hibernate-validator-distribution:发布到 SourceForge,对于那些利用 Maven 仓库的人来说没有用处。

  • 从现在开始,Hibernate Validator CDI 扩展将不再允许注入 `org.hibernate.validator.internal.engine.ValidatorFactoryImpl` 和 `org.hibernate.validator.internal.engine.ValidatorImpl` 类型,即 `@Inject ValidatorFactoryImpl factory;` 或 `@Inject ValidatorImpl validator;` 将会失败。仍然可以通过它们实现的任何公共接口注入这些类型,例如 `@Inject HibernateValidatorFactory factory;` 或 `@Inject Validator validator;` / `@Inject ExecutableValidator validator;`。

8.0.x

8.0.0.CR1

  • `GetterPropertySelectionStrategy` SPI 合同已经调整。`getGetterMethodNameCandidates()` 方法现在返回一个 `List` 而不是一个 `Set`。

8.0.0.Alpha3

没有迁移问题。

8.0.0.Alpha2

没有迁移问题。

8.0.0.Alpha1

  • Jakarta EE 10

  • 现在使用的 EL 实现是 `org.glassfish.expressly:expressly`

    <dependency>
       <groupId>org.glassfish.expressly</groupId>
       <artifactId>expressly</artifactId>
       <version>5.0.0-M1</version>
    </dependency>

7.0.x

7.0.0.CR1

  • Jakarta EE 9 (也称为 `jakarta.*` 包的大变更)

  • XML 命名空间已更改

  • `@SafeHtml` 约束已删除

  • 默认情况下,表达式语言对自定义违规的禁用

  • 默认情况下,表达式语言对约束的 Bean 方法执行禁用

6.2.x

6.2.0.CR1

  • `@SafeHtml` 约束已删除

  • 默认情况下,表达式语言对自定义违规的禁用

  • 默认情况下,表达式语言对约束的 Bean 方法执行禁用

6.1.x

6.1.7.Final

没有迁移问题。

6.1.6.Final

没有迁移问题。

6.1.5.Final

没有迁移问题。

6.1.4.Final

没有迁移问题。

6.1.3.Final

没有迁移问题。

6.1.2.Final

没有迁移问题。

6.1.1.Final

没有迁移问题。

6.1.0.Final

  • `@SafeHtml` 已被弃用并标记为将来删除。

6.0.x

6.0.23.Final

没有迁移问题。

6.0.22.Final

没有迁移问题。

6.0.21.Final

没有迁移问题。

6.0.20.Final

没有迁移问题。

6.0.19.Final

没有迁移问题。

6.0.18.Final

  • `@SafeHtml` 已被弃用并标记为将来删除。

6.0.17.Final

没有迁移问题。

6.0.16.Final

没有迁移问题。

6.0.15.Final

没有迁移问题。

6.0.14.Final

没有迁移问题。

6.0.13.Final

没有迁移问题。

6.0.12.Final

  • 如果您使用的是 CDI 集成,请确保要验证的所有 bean 都具有 Bean Validation 注解(无论是约束、`@Valid` 还是 `@ValidateOnExecution`)。如果需要添加注解,只需在类中添加一个简单的 `@ValidateOnExecution` 即可。此限制在 6.0.10.Final 之前存在,现在由于 CDI 应用程序的启动时间严重回归而再次出现。

6.0.11.Final

  • 我们从 `javax.el` 解析器列表中删除了 `StaticFieldELResolver`。此功能是在 6.x 周期中添加的,从未记录。如果您想从 EL 表达式中调用方法,只需将包含方法的对象注入为变量。

6.0.10.Final

  • 一些验证消息已更改以更一致。也就是说,您应该依赖于约束注解对违规进行分类,而不是依赖于消息。

  • 我们修复了 `JPATraversableResolver` 未正确初始化(因此我们使用默认解析器)的问题:`JPATraversableResolver` 现在在任何 JPA 环境中默认使用,因为它应该这样(因此 Hibernate Validator 不会验证或级联尚未加载的延迟加载属性)。如果您不想要这种行为,可以为您的 `ValidatorFactory` 覆盖 `TraversableResolver`。此回归是在 6.0.3.Final 中引入的。

  • 我们修复了 CDI 扩展,使其能够正确考虑类层次结构中的注解。在 6.0.10.Final 之前,如果所考虑的类本身没有任何与验证相关的注解,但其类层次结构中有,则类层次结构中的注解会被忽略。现在不再是这种情况。注意:如果所考虑的类本身至少有一个与验证相关的注解,则效果良好。

6.0.9.Final

  • 约束验证器负载(在 6.0.8.Final 中引入的孵化功能)已从 `HibernateConstraintValidatorInitializationContext` 移动到 `HibernateConstraintValidatorContext`。有关更多信息,请参见 文档

6.0.8.Final

没有迁移问题。

6.0.7.Final

没有迁移问题。

6.0.6.Final

没有迁移问题。

  • 为了提高与之前在 WildFly 中提供的版本的兼容性,我们在 6.0 的早期版本中重新引入了几个被移除的东西

    • `hibernate.validator.constraint_mapping_contributor` 属性(您现在可以使用 `hibernate.validator.constraint_mapping_contributors` 属性)

    • 约束声明 API 中的 `ignoreAnnotations()`(您现在可以使用 `ignoreAnnotations(boolean)`)

    • 这些功能已弃用并计划删除,因此它们将在某个时候被删除

6.0.5.Final

没有迁移问题。

6.0.4.Final

没有迁移问题。

6.0.3.Final

没有迁移问题。

6.0.2.Final

没有迁移问题。

6.0.1.Final

  • Hibernate Validator 现在在尝试对 bean 中不存在的属性或方法执行验证时,在任何情况下都会抛出异常(在此版本之前,如果 bean 完全不受约束,则不会抛出任何错误,并且在验证方法参数时会抛出错误,但在验证返回值时不会)。更一般地说,现在对各种 `Validator#validate…​()` 方法参数的健全性检查始终应用,即使 bean 未受约束。

6.0.0.Final

  • Hibernate Validator 的组 ID 已从 `org.hibernate` 更改为 `org.hibernate.validator`。分别通过 `org.hibernate.validator:hibernate-validator:6.0.0.Final`、`org.hibernate.validator:hibernate-validator-cdi:6.0.0.Final` 和 `org.hibernate.validator:hibernate-validator-annotation-processor:6.0.0.Final` 引用这些工件。

    为了简化迁移,将为 HV 6 发布系列提供重定位工件。检查构建的输出,如果您看到类似 "[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 坐标,应升级到新的坐标。

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

  • 删除/更改实验性功能,以支持 Bean Validation 2.0 中标准化的等效功能

    • 已删除实验性合同 `org.hibernate.validator.spi.time.TimeProvider` 和相关方法 `HibernateValidatorConfiguration#timeProvider()`、`HibernateValidatorContext#timeProvider()` 和 `HibernateConstraintValidatorContext#getTimeProvider()` 以及相关常量 `HibernateValidatorConfiguration#TIME_PROVIDER`。使用 BV 2.0 定义的 `javax.validation.ClockProvider` 作为替代 (HV-1135)。

    • 已删除实验性注解 `org.hibernate.validator.valuehandling.UnwrapValidatedValue`、枚举 `org.hibernate.validator.valuehandling.UnwrapMode` 以及约束声明 API 中的相应方法 `unwrapValidatedValue()`,以支持新的 `javax.validation.valueextraction.Unwrapping` 约束负载 (HV-1207)。

    • 已删除实验性合同 `org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper`、相关方法 `HibernateValidatorConfiguration#addValidationValueHandler()` 和 `HibernateValidatorContext#addValidationValueHandler()` 以及相关常量 `HibernateValidatorConfiguration.VALIDATED_VALUE_HANDLERS`。改用标准化接口 `javax.validation.valueextraction.ValueExtractor` (HV-1166)。

    • 当您有以下约束定义 `@NotNull Optional<@NotNull String> value` 并将 `value` 设置为 null 时,HV 以前会报告 2 个违规,每个 `@NotNull` 定义一个。在 HV 6.x 中不再是这种情况,如果容器为 null,则不再提取和验证容器中的值 (HV-1240)。

    • 表示已验证容器元素的属性路径节点(例如,在验证 `List<@Email String emails` 时)现在由标准化节点类型 `CONTAINER_ELEMENT` 表示,而不是 `PROPERTY`* 进一步更改

    • `org.hibernate.validator.cfg.defs.NotBlankDef`、`NotEmptyDef` 和 `EmailDef` 现在创建标准化约束 `@NotBlank`、`@NotEmpty` 和 `@Email`,而不是传统的特定于 HV 的对应项 (HV-1368)

    • 参数名称提供者实现 `org.hibernate.validator.parameternameprovider.ReflectionParameterNameProvider` 已被删除,因为它随着 Bean Validation 2.0 变得过时,其中通过反射检索参数名称是默认行为 (HV-1118)。

    • 现在需要实现 Expression Language 3.0 (JSR 341)。EL 3.0 也是 BV 1.1 规范之前唯一强制执行的版本,但 HV 5.x 可以与 EL 2 实现一起使用。例如,将以下依赖项添加到您的项目中:`org.glassfish:javax.el:3.0.1-b08`。

    • 已删除配置选项 `hibernate.validator.constraint_mapping_contributor`(在 5.3 中已弃用)。它被 `hibernate.validator.constraint_mapping_contributors` 替换,后者接受用逗号分隔的贡献者列表。常量 `o.h.v.HibernateValidatorConfiguration#CONSTRAINT_MAPPING_CONTRIBUTOR` 也已删除,并被 `o.h.v.HibernateValidatorConfiguration#CONSTRAINT_MAPPING_CONTRIBUTORS` 替换。

    • 已删除约束声明 API 中已弃用的方法 `ignoreAnnotations()`,以支持 `ignoreAnnotations(boolean)` (HV-1120)

    • 注解处理器模块的所有实现类都已重新定位到 `org.hibernate.validator.ap.internal` 包中。这些类从未打算用于公共使用,预计不会有任何迁移影响。该模块中唯一面向用户的类 `org.hibernate.validator.ap.ConstraintValidationProcessor` 保持不变 (HV-1396)。

5.4.x

5.4.1.Final

没有迁移问题。

5.4.0.Final

没有迁移问题。

5.4.0.CR1

没有迁移问题。

5.4.0.Beta1

没有迁移问题。

5.3.x

5.3.4.Final

没有迁移问题。

5.3.3.Final

没有迁移问题。

5.3.2.Final

没有迁移问题。

5.3.1.Final

  • 我们稍微改变了 `javax.el ExpressionFactory` 的初始化方式。在此版本之前,如果您使用的是 `ResourceBundleMessageInterpolator`,HV 可以仅通过对 `javax.el` API 的依赖关系来初始化,因为 `ExpressionFactory` 在引导时未初始化(并且它会在消息插值时失败)。由于我们现在在引导时初始化 `ExpressionFactory`,因此如果使用 `ResourceBundleMessageInterpolator`,还需要使用 `javax.el` 实现。所以,最终,要么您根本不使用 `ResourceBundleMessageInterpolator`,然后您不需要任何 `javax.el` 依赖关系,要么您使用 `ResourceBundleMessageInterpolator` 以及 `javax.el` API 和实现被 HV 要求。

5.3.0.Final

没有迁移问题。

5.3.0.CR1

  • 已从公共 API 中删除(实验性的)`ConstraintDefinitionContributor` 概念。相反,在需要以编程方式添加约束定义时,应该使用新的方法 `ConstraintMapping#constraintDefinition()`。此更改使以编程方式定义和声明约束的 API 与 XML 方法一致,从而实现相同的功能。以下元素已被删除

    • 接口 `o.h.v.spi.constraintdefinition.ConstraintDefinitionContributor`

    • 常量 o.h.v.HibernateValidatorConfiguration#CONSTRAINT_DEFINITION_CONTRIBUTORS

    • 方法 o.h.v.HibernateValidatorConfiguration#addConstraintDefinitionContributor()

    • 方法 o.h.v.HibernateValidatorConfiguration#getDefaultConstraintDefinitionContributor()

  • 通过 Java 服务加载机制(通过 META-INF/services/javax.validation.ConstraintValidator 文件)添加约束验证器的方法仍然存在。

  • 配置选项 hibernate.validator.constraint_mapping_contributor 已被弃用,取而代之的是 hibernate.validator.constraint_mapping_contributors,它接受以逗号分隔的贡献者列表。常量 o.h.v.HibernateValidatorConfiguration#CONSTRAINT_MAPPING_CONTRIBUTOR 已被弃用,取而代之的是 o.h.v.HibernateValidatorConfiguration#CONSTRAINT_MAPPING_CONTRIBUTORS (HV-1065)

5.2.x

5.2.4.Final

没有迁移问题。

5.2.3.Final

没有迁移问题。

5.2.2.Final

方法 AnnotationProcessingOptions#ignoreAnnotations() 已被弃用,并计划在将来的版本中删除。请改用 AnnotationIgnoreOptions#ignoreAnnotations(boolean)

5.2.1.Final

没有迁移问题。

5.2.0.Final

没有迁移问题。

5.1.x

5.1.0.CR1

  • 在 5.1.0.Beta1 中引入的 @Mod10Check@Mod11Check 约束进行了全面改进。索引现在始终为包含(尤其是 endIndex),并且始终相对于验证的值,独立于 ignoreNonDigitCharacters。此外,checkDigitPosition 已重命名为 checkDigitIndex

5.1.0.Alpha1

  • 如果在用于配置一个验证器工厂的映射中多次配置同一个元素(类型、属性、方法等),则程序化约束声明 API 现在会引发 ValidationException。虽然这在以前是可能的,但不建议这样做,因为它可能会在配置冲突的注释忽略选项时导致问题 (HV-716)。相反,选择任何元素只配置一次,然后应用所有必需的配置。

  • 当您自己从源代码构建 Hibernate Validator 时,您现在需要使用 JDK 7 和 Maven 3.0.3 或更高版本。请注意,创建的二进制文件仍然与 Java 6 兼容 (HV-619, HV-797)。

5.0.x

5.0.1.Final

没有迁移问题。

5.0.0.Final

没有迁移问题。

5.0.0.CR5

  • Hibernate Validator CDI 可移植扩展已从主 JAR 中提取到一个单独的模块中 (HV-778)。要使用该扩展,必须将依赖项 org.hibernate:hibernate-validator-cdi:5.0.0.CR5 添加到类路径中。

5.0.0.CR4

没有迁移问题。

5.0.0.CR3

  • @ValidateExecutable 已重命名为 @ValidateOnExecution,并引入了 ExecutableType.IMPLICIT - BVAL-437

  • MethodDescriptor#areParametersConstrained 已重命名为 MethodDescriptor#hasConstrainedParametersMethodDescriptor#isReturnValueConstrained 已重命名为 MethodDescriptor#hasConstrainedReturnValue - BVAL-432

  • XML 配置元素 <validated-executables></validated> 已重命名为 <default-validated-executable-types></default>,匹配的 BootstrapConfiguration#getValidatedExecutableTypes 已重命名为 BootstrapConfiguration#getDefaultValidatedExecutableTypes - BVAL-435

5.0.0.CR2

没有迁移问题。

5.0.0.CR1

  • ParameterNameProvider 接口的方法现在返回 List 而不是 String[] - BVAL-409

  • @CrossParameterConstraint 已被 @SupportValidationTarget 取代 - BVAL-391

5.0.0.Beta1

  • 已将 javax.validation.MethodValidator 重命名为 ExecutableValidatorj.v.Validator#forMethods() 已重命名为 forExecutables() (BVAL-355)

  • 使方法 j.v.ExecutableValidator#validateConstructorParameters()validateConstructorReturnValue() 更易于使用 (BVAL-358)

  • 已弃用 org.hibernate.validator.messageinterpolation.ValueFormatterMessageInterpolator;现在可以在 EL 表达式中使用验证的值 (BVAL-223)

  • 已删除注释 javax.validation.cdi.MethodValidated (BVAL-376)

  • 已删除 Maven 原型 (HV-650)

5.0.0.Alpha2

  • 此版本需要 Bean Validation 1.1.0.Beta2

  • 方法验证方法已从 javax.validation.Validator 移动到 MethodValidator (BVAL-310)

  • javax.validation.ConfigurationSource 已重命名为 BootstrapConfiguration (BVAL-293)

  • 已删除在 Hibernate Validator 4.3.0 中弃用的类型 (HV-584)

5.0.0.Alpha1

  • 此版本需要 Bean Validaton 1.1 作为依赖项(更具体地说,是 1.1.0.Alpha1)

  • 自定义方法验证功能已被 Bean Validation 1.1 指定的方法验证所取代

  • 已删除来自 HV-561 的已弃用类和方法。这意味着如果您使用任何受影响的 API,则需要迁移

4.3.x

本节介绍了 4.3.0 版本的不同版本中所做的更改。它可以帮助您从 4.2.0.Final 版本迁移到 4.3.0.Final 版本(尚未发布)或在 4.3.0 版本的不同版本之间迁移。Hibernate Validator 4.3 需要 Java 6!

4.3.0.Beta1

HV-561 引入了几个弃用(有关完整的弃用列表,请参阅 JavaDoc

  • org.hibernate.validator.group.DefaultGroupSequenceProvider 已被弃用,取而代之的是 org.hibernate.validator.group.spi.DefaultGroupSequenceProvider

  • org.hibernate.validator.resourceloading.ResourceBundleLocator 已被弃用,取而代之的是 org.hibernate.validator.spi.resourceloading.ResourceBundleLocator

  • org.hibernate.validator.cfg.ConstraintMapping 的构造函数已弃用。现在可以通过 HibernateValidatorConfiguration#createConstraintMapping() 创建 ConstraintMapping 实例

  • org.hibernate.validator.method 及其包含的类已弃用,目前尚无替代方案。在 Hibernate Validator 5 中,将删除此包,以与 Bean Validation 1.1 保持一致。然后,方法级验证方法将通过 javax.validation.Validator 提供。

  • org.hibernate.validator.internal.util.LazyValidatorFactory 已被弃用,将在 HV 5 中删除

4.3.0.Alpha1

这是 Hibernate Validator 4.2.0.Final 之后并向后兼容的第一个版本。但是,使用的日志记录框架已更改为 JBoss Logging。这意味着 org.jboss.logging:jboss-logging 现在是一个必需的运行时依赖项,取代了 org.slf4j:slf4j-api。您仍然可以使用 slf4j、log4j 或 Java Logging。JBoss Logging 只是一个额外的层,它允许对日志记录和异常消息进行国际化(i18n),以及为这些消息提供唯一的 ID。在幕后,JBoss Logging 将使用您选择的日志记录框架来记录消息。

Hibernate Validator 现在需要 Java 6 运行时。

4.2.x

本节介绍了 4.2.0 版本的不同版本中所做的更改。它可以帮助您从 4.1.0.Final 版本迁移到 4.2.0.Final 版本或在 4.2.0 版本的不同版本之间迁移。

4.2.0.Final

此版本没有引入任何可能破坏您现有代码的修改,如果您已经迁移到 4.2.0.CR1 版本。如果您从 4.1.0.Final 版本迁移,以下部分将介绍导致此最终版本的不同版本中所做的更改。

4.2.0.CR1

如您所知,Hibernate Validator 允许以编程方式配置约束。此版本的主要功能是允许对方法进行程序化配置 (HV-431)。为了以一种明确的方式实现这一点,我们不得不对程序化 API 进行一些更改。

另一个可能影响您现有代码的次要修改(如果您从 Beta2 版本迁移)是 HV-488。如果您使用方法元数据 API,您会看到 MethodDescriptor 的名为 getParameterConstraints() 的方法已重命名为 getParameterDescriptors(),以避免混淆。

4.2.0.Beta2

Beta1 版本引入了在方法上指定约束的可能性。如果您使用此功能,以下更改将影响您的代码。

此版本引入的一个重大更改是 HV-421,它定义了参数约束验证的行为。通常,逻辑 AND 用于组合在给定字段或方法上定义的类层次结构中的所有约束。但是,对方法参数约束执行相同的操作会导致与编程约定定义的歧义,其中子类型只能削弱超类型定义的先决条件。对于此版本,我们选择了一个保守的替代方案,它禁止在类层次结构中的同一个参数上定义多个参数约束。

另一个次要修改是方法 MethodValidator#validateParameters()(允许验证方法的所有参数)已重命名为 MethodValidator#validateAllParameters() (HV-415)。

4.2.0.Beta1

BVTCK-12 以及 HV-395 需要对 javax.validation.Path 实现进行更改。除非您迭代由 Constraint.getPropertyPath() 返回的 Path 实例,否则您不会受到此更改的影响。

当创建 ConstraintDef 的子类时,不再需要重复消息、有效负载和组的定义。ConstraintDef 现在使用自引用泛型。

返回顶部