Значения параметров аннотации могут быть только выражениями времени компиляции.Это означает, что для @Size(min=X, max=Z)
X и Z должны быть разрешаемы во время компиляции.
Поскольку min
и max
объявлены как int
на @Size
, вы застряли.
Если вам нужны разные значения для min
, лично для меняпосмотрите два способа сделать это .
Сначала , вы можете использовать группировку по валидаторам.Используйте одну группу для min=1
и одну группу для min=5
.Например, давайте рассмотрим класс Test
:
public class Test {
@NotNull
@Size.List({
@Size(min = 1, groups = GroupOne.class),
@Size(min = 5, groups = GroupTwo.class)
})
private String prop;
public String getProp() {
return prop;
}
public void setProp(String prop) {
this.prop = prop;
}
}
Вы должны объявить группы:
public interface GroupOne {}
public interface GroupTwo {}
Затем создайте некоторый объект тестирования и валидатор, чтобы идти с ним:
Test test = new Test();
test.setProp("XY");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Затем проверьте с помощью групп:
Set<ConstraintViolation<Test>> resultOne = validator.validate(test, GroupOne.class);
Set<ConstraintViolation<Test>> resultTwo = validator.validate(test, GroupTwo.class);
Первый случай действителен с min=1
и "XY".length() == 2
, но второй не удастся, потому что min=5
.
ЭтоМетод предполагает выполнение проверки вручную, и я не думаю, что для проверки можно просто положиться на @Valid
на аннотированный метод @RequestMapping
(поскольку @Valid
- это всего лишь триггер для проверки без упоминания требуемогогруппа для проверки).К счастью, Spring очень гибок, и вам не нужно будет слишком долго вызывать валидатор.
Второй вариант , который я вижу, включает создание собственной аннотации валидации с соответствующим валидатором. Здесь вы можете найти простой пример для начала .С помощью этого решения вы можете объявить min
и max
как строковые ключи, которые ваш валидатор разрешит в пакетах до проверки.Это решение, однако, более затратно, чем первое.