2012-12-12 43 views
3

我已經創建了一個由@digits的JSR303複合註釋

@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「整」值是複合註釋和@Min指定當PositiveInteger是使用

例如

public Demo{ 
    @PositiveInteger(integer=1) 
    private Integer num1; 

    @PositiveInteger(integer=2) 
    private Integer num2; 
} 

其中NUM1可以是1-9,和NUM2可以是1-99。

這是甚至可能的,如果是這樣,我該怎麼做呢?

目前,我已經提供了一個定製ConstraintValidator在那裏我將不得不爲@digits和@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; 
} 
+1

我認爲這是一種方式,但是您確定在類型檢查後需要regexp驗證嗎?你可以檢查字符串的大小 – hoaz

+0

我發現很難理解你實際要問什麼,看起來你的代碼/例子也不一致。你可能會改述你的問題嗎? – Hardy

回答

12

你可以利用@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

+0

謝謝。我認爲這是我一直在尋找的。我會試試這個。 – user1898299

+1

這正是我所期待的。 OP應該接受這個答案。 – Nikordaris