2012-02-13 3 views
6

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

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

Спасибо!

ответ

3

Когда поля отключены они передаются к контроллеру как null. Я хотел бы добавить проверку, которая разрешит либо null i.e отключенное поле, либо поле not blank поле i.e, но пустое поле.
Итак, я создал пользовательскую аннотацию 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 { }; 
} 

Validator класс

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) { 

    } 
} 

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

8

Если вы используете JSR 303 Bean validation, вы можете использовать validation groups (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{} 

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

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

До весны 3.1 не было никакого способа, чтобы указать которая должна была использоваться для проверки (потому что @Validated не существует, а @Validate не имеет атрибута группы), поэтому вам нужно начать проверку на ha й код: это пример того, как инициировать проверку в зависимости от раздела ведьмы, включен в 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 { 
    ... 
    } 
} 

(Кстати: Для решения Спринг 3.0, также возможно, чтобы позволить Спринг впрыскивать валидатор:

@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> 

)

+0

Похож на действительно хорошее предложение. Просто интересно, как применить это к полям, присутствующим в DTO. У меня мало полей, которые не присутствуют в bean/domain objecct, но присутствуют в DTO, и я хочу добавить для них также проверки. – xyz

+0

Вы можете поместить эту аннотацию javax.validation (NotNull, ...) в полях очень класса, Entity DTO, ... В приведенном выше примере UserInput должен быть DTO – Ralph

Смежные вопросы