【问题标题】:Hibernate Validator boolean logicHibernate Validator 布尔逻辑
【发布时间】:2015-04-18 01:58:51
【问题描述】:

我正在考虑使用布尔逻辑和我的 bean 验证在与约束条件不够的情况下使用 Hibernate Validator。我发现可以通过使用@ConstraintComposition 注释作为described in the documentation 创建一个新注释来更改此默认行为。该文档提供了以下示例。

@ConstraintComposition(OR)
@Pattern(regexp = "[a-z]")
@Size(min = 2, max = 3)
@ReportAsSingleViolation
@Target({ METHOD, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = { })
public @interface PatternOrSize {
    String message() default "{org.hibernate.validator.referenceguide.chapter11." +
            "booleancomposition.PatternOrSize.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

使用这个@PatternOrSize 验证约束意味着输入字符串是或者小写的大小在2到3之间。现在这引发了几个问题:

  • 相信必须创建一个新注释来更改默认布尔逻辑行为。它是否正确?如果可以在类字段中定义布尔逻辑,那就太好了,但可能不可能?
  • 是否可以在不创建自定义验证器的情况下进一步自定义布尔逻辑行为,例如同时定义ANDOR?我找不到任何表明这是可能的东西,但也许我错过了一些东西。
  • 最重要的是:是否可以使@Pattern@Size 约束的参数动态化?因为否则我想我将不得不为我需要的每个参数组合定义一个新的注释。定义一个新注解只是为了将参数更改为@Size 似乎不可行,但可能有必要?

提前谢谢你。

【问题讨论】:

    标签: java validation bean-validation hibernate-validator


    【解决方案1】:

    我相信必须创建一个新注释来更改默认的布尔逻辑行为。这是正确的吗?

    是的,没错。

    是否可以在不创建自定义验证器的情况下进一步自定义布尔逻辑行为,例如同时定义 AND 和 OR?

    您可以尝试创建一个在不同级别使用 AND 和 OR 的分层组合约束(即由其他约束组成的约束)。我还没有尝试过(我认为我们没有对其进行测试)但它可能值得一试。不过,根据所需的布尔逻辑,它可能不适合您的用例。

    是否可以使@Pattern 和@Size 约束的参数动态化?

    是的,您可以通过@OverridesAttribute

    @ConstraintComposition(OR)
    @Pattern(regexp = "[a-z]")
    @Size(min = 2, max = 3)
    @ReportAsSingleViolation
    @Target({ METHOD, FIELD })
    @Retention(RUNTIME)
    @Constraint(validatedBy = { })
    public @interface PatternOrSize {
    
        String message() default "...";
        Class<?>[] groups() default { };
        Class<? extends Payload>[] payload() default { };
    
        @OverridesAttribute(constraint=Size.class, name="min")
        int min() default 0;
    
        @OverridesAttribute(constraint=Size.class, name="max")
        int max() default Integer.MAX_VALUE;
    
        @OverridesAttribute(constraint=Pattern.class, name="regexp")
        String regexp();
    }
    

    【讨论】:

    • @Gunnar 有没有办法为这些约束中的每一个创建单独的错误消息?考虑这种情况:NotNull NotEmpty,我确实希望 NotNull 与 NotEmpty 分开。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多