Java JSR303复合注释

Java JSR303复合注释,java,bean-validation,Java,Bean Validation,我创建了一个由@Digits和@Min组成的复合注释 @Digits(integer=12, fraction=0) @Min(value=0) @ReportAsSingleViolation @Documented @Retention(RetentionPolicy.RUNTIME) @Target( { FIELD, METHOD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Constraint(validatedBy={}) public

我创建了一个由@Digits和@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 {};
}
@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;
}
其中num1可以是1-9,num2可以是1-99

这可能吗?如果可能,我该怎么做

目前,我必须提供一个定制的ConstraintValidator,在这里我可以得到@Digits和@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 {};
}
@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;
}
@已记录
@保留(RetentionPolicy.RUNTIME)
@目标({字段,注释类型,参数})
@约束(validatedBy=PositiveIntConstraintValidator.class)
public@interface-PositiveInt{
字符串消息()默认为“positive.int.msg”;
类[]组()默认值{};
类您可以利用:

@位(整数=0,分数=0)
@最小值(值=0)
@报告违规行为
@记录
@保留(RetentionPolicy.RUNTIME)
@目标({字段、方法、注释类型、构造函数、参数})
@约束(validatedBy={})
public@interface-PositiveInteger{
字符串消息()默认值“{positive.int.msg}”;
类[]组()默认值{};

Classi认为这是一种方法,但您确定在类型检查后需要regexp验证吗?您可以只检查字符串的大小。我发现很难理解您实际提出的问题,而且您的代码/示例似乎也不一致。您可以重新表述您的问题吗?谢谢。我想这就是我一直在寻找的。我我来试试。这正是我想要的。OP应该接受这个答案。