And*_*rey 7 java validation bean-validation
我想在字段(本例中是字符串)上放置一组标准约束(如非空字母数字字符串,长度为3到240个字符),并且想要知道是否有一种方法可以覆盖模型代码中的某些约束.这也将是一个重写,或者只是对覆盖注释进行两次验证?
它应该是这样的
@AlphanumericString
@Size(min=100, max=150) //override standart values from AlphanumericString annotation
Run Code Online (Sandbox Code Playgroud)
谢谢你的回答
好的,回答我自己.@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}";
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的问题.该JSR 303 Bean验证规范描述了部分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),根据文档,它们将按照特定顺序单独验证/处理.
所以回答你的问题.不,@AlphanumericString当您使用@Size另外时,将不会对您应用任何覆盖.为了能够实现我认为您尝试执行的操作,您可以创建一个约束组合,其中您可以从组成注释中覆盖属性:
@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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
并使用它:
@AlphanumericString(min = 100, max = 150)
Run Code Online (Sandbox Code Playgroud)