Параметризуемые значения проверки JSR-303 - PullRequest
4 голосов
/ 04 августа 2011

Я использую проверку bean-компонента JSR-303 и Spring 3, и мне нужно предоставить различные значения для аннотации в зависимости от варианта использования.

Например, значение параметра min в @Size(min=?) должно быть 1 для некоторой проверки и 5 для другого случая, и я хочу прочитать эти значения из файла свойств.

Я знаю, что параметр сообщения можно прочитать из файла ValidationMessages.properties, если он указан в качестве ключа, но как насчет другого параметра?

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Как указано в dpb, вы можете использовать группы проверки , чтобы задать одно и то же ограничение с разными значениями атрибутов.

Если вы работаете с Hibernate Validator в качестве реализации BV, исходя из этого, вы можете использовать программный API вместо аннотаций для определения своих ограничений. Таким образом, вы можете получить конкретные значения ограничений во время выполнения, например:

int minValue1 = ...; //read from properties file etc.
int minValue2 = ...;

//programmatically define the constraints for the Test type
ConstraintMapping mapping = new ConstraintMapping();
mapping.type( Test.class )
    .property( "prop", FIELD )
        .constraint( new NotNullDef() )
        .constraint( new SizeDef().min( minValue1 ).groups( GroupOne.class ) )
        .constraint( new SizeDef().min( minValue2 ).groups( GroupTwo.class ) );

//retrieve a validator using the programmatic constraint mapping
HibernateValidatorConfiguration config = 
    Validation.byProvider( HibernateValidator.class ).configure();
config.addMapping( mapping );
ValidatorFactory factory = config.buildValidatorFactory();
Validator validator = factory.getValidator();
3 голосов
/ 04 августа 2011

Значения параметров аннотации могут быть только выражениями времени компиляции.Это означает, что для @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 как строковые ключи, которые ваш валидатор разрешит в пакетах до проверки.Это решение, однако, более затратно, чем первое.

...