2012-02-13 16 views
6

Bazı radio düğmesi ve check-boxes içeren bir form var. Kullanıcı bir radio button veya check-box seçtiğinde/seçimini kaldırdığında, başka giriş alanları etkinleştirilir/devre dışı bırakılır.
Yalnızca kullanıcı formunu gönderdiğinde etkinleştirilen alanlar için doğrulama eklemek istiyorum. Gönderme sırasında devre dışı bırakılan alanlar doğrulama için dikkate alınmamalıdır.İlkbaharda koşullu doğrulamalar

İstemci tarafında doğrulamayı eklemek istemiyorum. Birden çok if doğrulayıcı eklemek yerine koşullu doğrulamayı Spring 3.0 uygulamasında uygulamak için daha iyi/kolay bir yol var mı?

Teşekkürler!

cevap

3

alanları devre dışı olduğunda, bunlar aktarılmaktadır (btw:

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

: Yay 3.0 çözeltisi için, Yay doğrulayıcı enjekte izin da mümkündür) null olarak kontrol edilir. null i.e devre dışı bırakılmış alana veya not blank alanına izin verilen ancak boş alana izin verecek bir doğrulama eklemek istedim.
null ve boş olmayan dizelere izin verecek özel bir ek açıklama NotBlankOrNull oluşturdum ve boş alanlarla da ilgileniyor.
İşte Ek Açıklama Ben de site ilgili daha fazla ayrıntıya güncelledik

@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 sınıfı

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

    } 
} 

olduğunu.

8

JSR 303 Bean doğrulamasını kullanırsanız, bunun için validation groups (groups) kullanabilirsiniz.

İki bölüm içeren bu kullanıcı girdiniz olduğunu varsayalım. Bölümlerin etkinleştirilip devre dışı bırakıldığını belirten iki boolean. Sen grupları için iki Arayüzleri ihtiyaç

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 
} 

(Tabii ki @NotNull daha yararlı ek açıklamaları kullanabilirsiniz). Sadece işaretleyici olarak çalışırlar.

public interface SectionA{} 

public interface SectionB{} 

Since Spring 3.1 doğrulamayı tetiklemek için denetleyici yönteminde (yerine @Validate arasında) Bahar @Validated ek açıklama kullanabilirsiniz:

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

Bahar 3.1 önce belirtmek için hiçbir yolu yoktu doğrulama için kullanılması gereken doğrulama grubu (@Validated olmadığı ve @Validate'un bir grup özniteliği olmadığı için), bu nedenle doğrulama işlemini ha tarafından başlatmanız gerekir. nd yazılı kod: Bu, bir örneği cadı bölümüne bağlı olarak validasyonun nasıl tetikleneceğinin ilkbahar 3.0'da etkinleştirildiğini gösterir.

@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 { 
    ... 
    } 
} 

+0

Gerçekten iyi bir öneriye benziyor. Sadece DTO'da bulunan alanlara nasıl uygulanacağını merak ediyorum. Fasulye/alan hedefinde bulunmayan, ancak DTO'da bulunan birkaç alanım var ve bunlar için de validasyonlar eklemek istiyorum. – xyz

+0

Bu javax.validation anntoation'ı (NotNull, ...) çok sınıf, Entity DTO, ... alanlarına yerleştirebilirsiniz. Yukarıdaki örnekte, UserInput bir DTO olmalıdır. – Ralph