Как проверять диапазон Java-бина, только если не ноль или ноль - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы использовать Java Bean Validation для проверки целого числа.Это проверка нескольких подтверждений.

В настоящее время я использую Spring Boot и проверку, а система использует @RestController, когда я получаю пост-вызов.

public Person addPerson(@RequestBody @Validated Person Person) {/*the code*/}

Я бы хотел, чтобы был подтвержден возраст, где эти значения действительны:

age == null or age == 0 or (age >= 15 and age <= 80)


public class Person {
    private Integer age;
}

Я хотел бы иметь возможность использовать текущие ограничения проверки Java.Нужно ли реализовывать мою собственную аннотацию ограничений?

Это было бы неплохо, но это не работает:

public class Person {
    @Null
    @Range(min=0, max=0)
    @Range(min=15, max = 80)
    private Integer age;
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете сгруппировать встроенные ограничения, используя ConstraintCoposition:

public class Test {

    private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

    @ConstraintComposition(CompositionType.AND)
    @Min(value = 0)
    @Max(value = 0)
    @Target( { ElementType.ANNOTATION_TYPE } )
    @Retention( RetentionPolicy.RUNTIME )
    @Constraint(validatedBy = { })
    public @interface ZeroComposite {
        String message() default "Not valid";
        Class<?>[] groups() default { };
        Class< ? extends Payload>[] payload() default { };
    }

    @ConstraintComposition(CompositionType.OR)
    @Null
    @ZeroComposite
    @Range(min=15, max = 80)
    @Target( { ElementType.METHOD, ElementType.FIELD } )
    @Retention( RetentionPolicy.RUNTIME )
    @Constraint(validatedBy = { })
    public @interface Composite {
        String message() default "Not valid";
        Class<?>[] groups() default { };
        Class< ? extends Payload>[] payload() default { };
    }

    @Composite
    private Integer age;


    public Test(Integer age) {
        this.age = age;
    }

    public static void main(String args[]) {
        validate(new Test(-1));
        validate(new Test(null));
        validate(new Test(0));
        validate(new Test(5));
        validate(new Test(15));
        validate(new Test(80));
        validate(new Test(81));
    }

    private static void validate(Test t) {
        Set<ConstraintViolation<Test>> violations = 
            factory.getValidator().validate(t);

        for (ConstraintViolation<Test> cv : violations) {
            System.out.println(cv.toString());
        }
    }
}
0 голосов
/ 21 сентября 2018

Согласно Реализация проверки для служб RESTful с Spring Boot правильная аннотация - @Valid (а не @Validated)

...