【问题标题】:Where is implementation of @Future defined?@Future 的实现在哪里定义?
【发布时间】:2012-07-22 09:32:01
【问题描述】:

Java 持久性和休眠使向实体添加属性级约束变得容易。

@Entity
@Table(name = "party")
public class PartyEntity {
    @Future
    public DateTime start;
}

javax.validation.constraint.Future 注解是在没有具体实现的情况下定义的。

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {})
public @interface Future {
    // ...
}

实际验证在哪里实施?如何扩展它以允许管理员覆盖?

虽然这里没有显示,但我已经在此约束上将组用于其他目的。

【问题讨论】:

  • 这只是一个注释,你不会找到它的“实现”。如果您提到验证逻辑的实现,我相信那是在您正在使用的验证库(实现 JSR 303)中。我敢打赌这是休眠验证。我认为这是您可以开始调查的起点

标签: java hibernate annotations bean-validation


【解决方案1】:

hibernate-validator 提供的许多验证器的实现:http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/validator-usingvalidator.html#validator-defineconstraints-builtin

如果您使用的是 Maven,只需将以下依赖项添加到 pom.xml 文件:

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

如何扩展它以允许管理员覆盖?

最简单的方法是write your own instead

【讨论】:

  • 作为警告 5.0.0.Alpha1 是 Alpha 版本,取决于 Bean Validation 1.1 的第一个公共预览版。 Hibernate Validator 4.x 与目前官方的 Bean Validation 1.0 版本保持一致。
【解决方案2】:

JSR 303 验证与 JPA 没有太多直接关系。当然也可以用它来验证 JPA 实体。实际问题是什么 - 很可能您想遵循 php-coder 的建议并实施新的注释和通过注释使用设置的约束验证。

如果由于某种神秘的原因,您确实必须更改在您的实现中处理 Future 注释的方式,那么解决方案当然是特定于实现的。假设您使用 Hibernate Validator 4.3,验证约束的实际检查发生在:

如何选择这些实现可能会受到org.hibernate.validator.internal.metadata.core.ConstraintHelper 的影响。我建议将您使用的实现源附加到您的 IDE,因为这样很容易导航到此类详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2022-10-02
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多