JSR303复合注释 [英] JSR303 Composite Annotation
本文介绍了JSR303复合注释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我创建了一个复合注释,其中包含@Digits和@Min
I've created a composite annotation that consists of @Digits and @Min
@Digits(integer=12, fraction=0)
@Min(value=0)
@ReportAsSingleViolation
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target( { FIELD, METHOD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Constraint(validatedBy={})
public @interface PositiveInt {
String message() default "{positive.int.msg}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
我的问题是,我想在我希望@Digits的地方重用这个注释使用PositiveInteger时指定的'整数'值
my problem is, I want to reuse this annotation where I want the @Digits 'integer' value to be specify when the PositiveInteger is use
示例
public Demo{
@PositiveInteger(integer=1)
private Integer num1;
@PositiveInteger(integer=2)
private Integer num2;
}
其中num1可以是1-9,num2可以是1-99。
where num1 can be 1-9, and num2 can be 1-99.
这是否可能,如果是这样,我该怎么办呢?
Is this even possible, if so, how do I go about this?
目前,我必须提供了一个自定义的ConstraintValidator,我将获得@Digits的验证码和@Min
Currently, I have to provides a custom ConstraintValidator where i would have my validation code for the @Digits and @Min
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target( { FIELD, ANNOTATION_TYPE, PARAMETER })
@Constraint(validatedBy=PositiveIntConstraintValidator.class)
public @interface PositiveInt {
String message() default "positive.int.msg";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int integer() default 1;
}
public class PositiveIntConstraintValidator implements ConstraintValidator<PositiveInt, Number> {
private int maxDigits;
@Override
public void initialize(PositiveInt constraintAnnotation) {
maxDigits = constraintAnnotation.integer();
if (maxDigits < 1){
throw new IllegalArgumentException("Invalid max size. Max size must be a positive integer greater than 1");
}
}
@Override
public boolean isValid(Number value, ConstraintValidatorContext context) {
if (value == null){
return true;
}
else if (value instanceof Long || value instanceof Integer || value instanceof Short || value instanceof BigInteger){
String regex = "\\d{"0," + maxDigits + "}";
return Pattern.matches(regex, value.toString());
}
return false;
}
推荐答案
您可以使用 @OverridesAnnotation :
@Digits(integer=0, fraction=0)
@Min(value=0)
@ReportAsSingleViolation
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target( { FIELD, METHOD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Constraint(validatedBy={})
public @interface PositiveInteger {
String message() default "{positive.int.msg}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@OverridesAttribute(constraint=Digits.class, name="integer")
int digits();
}
这样在 @ PositiveInteger#digits中给出的值()
将传播到 @Digits
。
这篇关于JSR303复合注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文