【问题标题】:JSR 303 Custom constraint OverrideJSR 303 自定义约束覆盖
【发布时间】:2011-12-06 06:35:11
【问题描述】:

我想在字段(在这种情况下为字符串)上放置一组标准约束(例如长度为 3 到 240 个字符的非空字母数字字符串),并且想知道是否有办法在型号代码。这也是覆盖,还是只验证覆盖的注释两次?

应该是这样的

@AlphanumericString
@Size(min=100, max=150) //override standart values from AlphanumericString annotation

谢谢你的回答

好的,回答我自己。有 @OverridesParameter 可以帮助重新分配嵌套注释参数

@Numerical
@Size //arbitrary parameter values
@ConstraintValidator(FrenchZipcodeValidator.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface FrenchZipCode {
    String message() default "Wrong zipcode";
    String[] groups() default {};

    @OverridesParameters( {
        @OverridesParameter(constraint=Size.class, parameter="min")
        @OverridesParameter(constraint=Size.class, parameter="max") } )
    int size() default 5;

    @OverridesParameter(constraint=Size.class, parameter="message")
    String sizeMessage() default "{error.zipcode.size}";

    @OverridesParameter(constraint=Numerical.class, parameter="message")
    String numericalMessage() default "{error.zipcode.numerical}";
}

source

【问题讨论】:

    标签: java validation bean-validation


    【解决方案1】:

    这是一个很好的问题。 JSR 303 Bean Validation specification 在 3.5 节中描述了验证例程。

    对于要验证的给定组,验证例程应用于 给定的 bean 实例预计将执行以下约束 没有特定顺序的验证:

    • 对于所有可访问的字段,执行与目标匹配的所有字段级别验证(包括在超类上表示的验证) 组,除非给定的验证约束已经 在此验证例程中针对给定的导航路径进行处理 (参见第 3.5.1 节)作为前一场小组赛的一部分。

    ...

    对象验证例程是这样描述的。对于每个 约束声明:

    • 为约束声明确定要使用的适当 ConstraintValidator(请参阅第 3.5.3 节)。
    • 对适当的数据执行 isValid 操作(来自约束验证实现)(参见第 2.4 节)
    • 如果isValid返回true,继续下一个约束,
    • 如果 isValid 返回 false,Bean Validation 提供程序会根据第 2.4 节中定义的规则填充 ConstraintViolation 对象,并将这些对象附加到约束违规列表中。

    在您的情况下,您处理一个简单的String 字段的验证,其中目标组是Default。您有两个验证约束(@AlphanumericString 和 @Size),根据文档将不按特定顺序单独验证/处理。

    所以回答你的问题。不,当您额外使用 @Size 时,不会对您的 @AlphanumericString 应用覆盖。为了能够实现我认为您尝试做的事情,您可以创建一个约束组合,您可以在其中覆盖来自组合注释的属性:

    @Pattern(regexp="[a-zA-Z]*")
    @Size
    @Constraint(validatedBy = AlphanumericStringValidator.class)
    @Documented
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    public @interface AlphanumericString {
       // ...
      @OverridesAttribute(constraint=Size.class, name="min")
      int min() default 3
      @OverridesAttribute(constraint=Size.class, name="max")
      int max() default 230;       
       // ...
    }
    

    并像这样使用它:

    @AlphanumericString(min = 100, max = 150)
    

    【讨论】:

    • 谢谢,已经想通了,会尝试使用这种方法,你能建议我一种加快验证的方法吗,除了每个应用程序只实例化验证器工厂一次,将验证划分为组和排序它们的处理时间从快到慢?
    猜你喜欢
    • 2012-08-20
    • 2011-10-30
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2012-02-22
    相关资源
    最近更新 更多