GroupSequence и упорядоченная оценка в JSR 303 - PullRequest
4 голосов
/ 12 марта 2011

В нашем приложении у нас есть такой случай:

  • Ограничения должны оцениваться в определенном порядке. (от дешевого до дорогого)
  • Ограничения не должны оцениваться после нарушения на поле.
  • Все поля должны быть проверены.

Для первых двух групповая последовательность подходит очень хорошо. Однако для 3-го требования я не смог найти способ решить.

public class AccountBean {

   @CheepValidation
   @ExpensiveValidation
   @VeryExpensiveValidation
   private String name;

   @CheepValidation
   @ExpensiveValidation
   @VeryExpensiveValidation
   private String surname
}

Например,

Допустим, для поля имени VeryExaciousValidation нарушается ограничение, а для поля фамилии - ограничение Ex накладных проверки.

Для этого случая я должен отобразить:

Для имени поля: только сообщение об ошибке VeryExaciousValidation Для поля фамилия: только сообщение об ошибке ExabilitiesValidation

Обратите внимание, что для фамилии поля мы не оценивали ограничение VeryExорогоValidation.

Есть ли способ реализовать это с помощью JSR 303?

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Вы можете использовать groups и @GroupSequence, но это немного громоздко.

public class AccountBean {

   @CheapValidation(groups=Name1.class)
   @ExpensiveValidation(groups=Name2.class)
   @VeryExpensiveValidation(groups=Name3.class)
   String name;

   @CheapValidation(groups=Surname1.class)
   @ExpensiveValidation(groups=Surname2.class)
   @VeryExpensiveValidation(groups=Surname3.class)
   String surname;

   public interface Name1 {}
   public interface Name2 {}
   public interface Name3 {}
   @GroupSequence({Name1.class, Name2.class, Name3.class})
   public interface Name {}

   public interface Surname1 {}
   public interface Surname2 {}
   public interface Surname3 {}
   @GroupSequence({Surname1.class, Surname2.class, Surname3.class})
   public interface Surname {}
}

Затем проверьте с помощью:

validator.validate(myAccountBean,
    AccountBean.Name.class, AccountBean.Surname.class)

Ключ должен иметь две полностью независимые групповые последовательности.

К сожалению, кажется, что вы должны явно перечислить группы для всех полей, которые вы хотите проверить.Я не смог заставить его работать с @GroupSequence по умолчанию.Кто-нибудь может улучшить это?

0 голосов
/ 07 апреля 2015

Я реализовал упорядоченную проверку с помощью GroupSequence, но, вообще говоря, реализация проверки компонентов EJB не является прозрачной.

То есть, пока первая группа полностью не подтверждена, вы не можете запустить проверку второй группы.

* 1005 Е.Г. *

У меня есть 3 проверенных поля с пользовательскими валидаторами. Идея довольно проста: каждое поле должно проверяться набором валидаторов независимо друг от друга (нисходящая мощность).

        @StringPropertyNotNullOrEmptyConstraint(message = "Group name is required", groups = {ValidationStep1.class})        
        private final StringProperty groupName;    

        @StringPropertyNotNullOrEmptyConstraint(message = "Group password is required", groups = {ValidationStep1.class})
        @StringPropertyMatchConstraint(message = "The given password phrases do not match", dependentProperties = {"groupPasswordMatch"}, groups = {ValidationStep2.class})
        private final StringProperty groupPassword;      

        @StringPropertyNotNullOrEmptyConstraint(message = "Group password match is required", groups = {ValidationStep1.class})
        @StringPropertyMatchConstraint(message = "The given passwords phrases do not match", dependentProperties = {"groupPassword"}, groups = {ValidationStep2.class})    
        private final StringProperty groupPasswordMatch;


        public interface ValidationStep1 {    
        }

        public interface ValidationStep2 {    
        }

        @GroupSequence({GroupDialogModel.class, ValidationStep1.class, ValidationStep2.class})
        public interface GroupDialogModelValidationSequence {    
        }

        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        Validator validator = validatorFactory.getValidator();    

        Set<ConstraintViolation<GroupDialogModel>> constraintViolations = validator.validate(this, GroupDialogModelValidationSequence.class);

Предостережение в этом подходе состоит в том, что каждое поле должно сначала пройти ValidationStep1 и только после успешного завершения каждой проверки шага 1 переходит к шагу 2. Например, даже если поля пароля не пусты, но содержат разные значения, проверка для они успешны, если поле имени группы не содержит никакого значения. И только после того, как я ввел какое-то значение в имя группы, группа ValidationStep1 успешно выполняется, а затем отображает результат проверки ValidationStep2 (пароли не совпадают).

Создание каждой группы для каждого поля в каждой последовательности - плохая практика, ИМХО, но, похоже, другого выбора нет.

Любое другое решение высоко ценится.

...