2012-02-13 101 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