2012-02-13 98 views
6

我有一個表格,其中包含一些radio按鈕和check-boxes。無論何時用戶選擇/取消選擇radio buttoncheck-box其他幾個輸入字段都是啓用/禁用的。
我想添加驗證僅當用戶提交表格時啓用的字段。在提交時禁用的字段不應被視爲驗證。春季條件驗證​​

我不想在客戶端驗證中添加此項。是否有更好/簡單的方法在Spring 3.0中實現條件驗證,而不是在驗證器中添加多個if

謝謝!

回答

3

當字段將被禁用它們轉移控制器爲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) { 

    } 
} 

我也更新我的site更多細節。

8

如果您使用JSR 303 Bean驗證,那麼您可以使用validation groupsgroups)。

假設你有這個用戶輸入,包含兩個部分。 這兩個布爾值指示段是啓用還是禁用。 (當然你也可以使用更多的有用的註釋比@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開始驗證nd書面代碼:這是一個示例如何在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的溶液中,也可以讓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> 

+0

看起來像一個非常好的建議。只是想知道如何將其應用於DTO中的領域。我有幾個字段不存在於bean/domain對象中,但存在於DTO中,我也想爲它們添加驗證。 – xyz 2012-02-13 09:34:51

+0

您可以將這個javax.validation anntoation(NotNull,...)放在非常類的實體DTO的字段中......在上面的例子中,UserInput應該是一個DTO – Ralph 2012-02-13 09:44:50