Условные проверки весной - PullRequest
       8

Условные проверки весной

6 голосов
/ 13 февраля 2012

У меня есть форма, содержащая некоторую кнопку radio и check-boxes.Всякий раз, когда пользователь выбирает / отменяет выбор radio button или check-box, некоторые другие поля ввода включаются / отключаются.
Я хочу добавить проверку только для полей, которые включены, когда пользователь отправляет форму .Поля, которые отключены на момент подачи заявки, не должны рассматриваться для проверки.

Я не хочу добавлять это в проверку на стороне клиента. Есть ли лучший / простой способ реализовать условную проверку в Spring 3.0 вместо добавления нескольких if в валидатор?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 13 февраля 2012

Если вы используете проверку bean-компонента JSR 303, вы можете использовать для этого группы проверки (groups).

Предположим, у вас есть этот пользовательский ввод, содержащий два раздела. Два логических значения, указывающие, включены ли секции или нет. (Конечно, вы можете использовать более полезные аннотации, чем @NotNull)

public class UserInput {
   boolean sectionAEnabled;
   boolean sectionBEnabled;

   @NotNull(groups=SectionA.class)
   String someSectionAInput;

   @NotNull(groups=SectionA.class)
   String someOtherSectionAInput;

   @NotNull(groups=SectionB.class)
   String someSectionBInput;

   Getter and Setter
}

Вам нужно два интерфейса для групп. Они работают только как маркер.

public interface SectionA{}

public interface SectionB{}

Начиная с Spring 3.1 вы можете использовать аннотацию Spring @Validated (вместо @Validate) в вашем методе контроллера для запуска проверки:

@RequestMapping...
public void controllerMethod(
         @Validated({SectionGroupA.class}) UserInput userInput, 
         BindingResult binding, ...){...}

До весны 3.1 не было возможности указать группу проверки, которая должна использоваться для проверки (поскольку @Validated не существует и @Validate не имеет атрибута группы), поэтому вам нужно чтобы запустить проверку вручную написанным кодом: в Spring 3.0 включен пример запуска проверки в зависимости от раздела ведьмы.

@RequestMapping...
public void controllerMethod(UserInput userInput,...){

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

  List<Class<?>> groups = new ArrayList<Class<?>>();
  groups.add(javax.validation.groups.Default.class); //Always validate default
  if (userInput.isSectionAEnabled) {
     groups.add(SectionA.class);
  }
  if (userInput.isSectionBEnabled) {
     groups.add(SectionB.class);
  }
  Set<ConstraintViolation<UserInput>> validationResult =
     validator.validate(userInput,  groups.toArray(new Class[0]));

  if(validationResult.isEmpty()) {
     ...
  } else {
     ...
  }
}

(Кстати: для решения Spring 3.0 можно также разрешить Spring ввести валидатор:

@Inject javax.validation.Validator validator

<mvc:annotation-driven validator="validator"/>

<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       <property name="validationMessageSource" ref="messageSource" />
</bean>

)

3 голосов
/ 21 февраля 2012

Когда поля отключены, они передаются в контроллер как null.Я хотел добавить проверку, которая позволит либо null то есть отключенное поле, либо not blank поле, то есть включенное, но пустое поле.
Поэтому я создал пользовательскую аннотацию NotBlankOrNull, которая будет разрешать null и непустые строки.он заботится о пустых местах.
Вот моя аннотация

@Documented
@Constraint(validatedBy = { NotBlankOrNullValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface NotBlankOrNull {
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

Класс валидатора

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> {

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if ( s == null ) {
            return true;
        }
        return s.trim().length() > 0;
    }

    @Override
    public void initialize(NotBlankOrNull constraint) {

    }
} 

Я также обновил более подробную информацию на моем сайте .

...