2012-02-13 14 views
6

Mam formularz, który zawiera przycisk radio i check-boxes. Za każdym razem, gdy użytkownik wybierze/cofnie wybór, kilka innych pól wejściowych zostanie włączonych/wyłączonych.
Chcę dodać walidację tylko dla pól, które są włączone, gdy użytkownik przesyła formularz. Pola wyłączone w momencie przesyłania nie powinny być brane pod uwagę do sprawdzania poprawności.Warunkowe zatwierdzenia na wiosnę

Nie chcę dodawać tego w walidacji po stronie klienta. Czy istnieje jakiś lepszy/łatwy sposób wdrożenia warunkowej weryfikacji w Spring 3.0 zamiast dodawania wielu if w walidatorze?

Dzięki!

Odpowiedz

3

Kiedy pola są wyłączone są przekazywane do kontrolera jako null. Chciałem dodać walidację, która pozwoli albo na pole nieaktywne, albo na pole not blank, to jest aktywne, ale puste pole.
Stworzyłem więc niestandardową adnotację NotBlankOrNull, która pozwoli na null i niepuste łańcuchy, a także zajmie puste miejsca.
Oto moja Adnotacja

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

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

    } 
} 

Mam również zaktualizowane więcej szczegółów na moim site.

8

Jeśli używasz sprawdzania JSR 303 Bean, możesz użyć do tego celu validation groups (groups).

Załóżmy, że masz dane wejściowe użytkownika, zawierające dwie sekcje. Dwa wartości logiczne wskazujące, czy sekcje są włączone, czy wyłączone. (Oczywiście można użyć bardziej użyteczne niż adnotacje @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 
} 

Potrzebne są dwa interfejsy dla grup. Działają tylko jako znacznik.

public interface SectionA{} 

public interface SectionB{} 

Since Spring 3.1 można użyć Wiosna @Validated adnotacji (zamiast @Validate) w metodzie kontrolera do uruchomienia Walidacja:

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

przed wiosną 3.1 nie było sposobu, aby określić grupa walidacji, która powinna zostać użyta do sprawdzania poprawności (ponieważ @Validated nie istnieje, a @Validate nie ma atrybutu grupy), dlatego należy rozpocząć sprawdzanie poprawności za pomocą ha nd napisany kod: Ten przykład, jak wyzwalać sprawdzanie poprawności w zależności od sekcji wiedźm jest włączony w 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 { 
    ... 
    } 
} 

(BTW: Do roztworu Wiosna 3.0, możliwe jest również, aby pozwolić Wiosna wstrzyknąć walidator:

@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

Wygląda na naprawdę dobrą sugestię. Zastanawiasz się, jak zastosować to do pól obecnych w DTO. Mam kilka pól, które nie są obecne w obszarze bean/domain object, ale są obecne w DTO i chcę również dodać do nich weryfikacje. – xyz

+0

Możesz umieścić tę anvację javax.validation (NotNull, ...) na polach bardzo klasowych, Entite DTO, ... W powyższym przykładzie UserInput powinno być DTO – Ralph