2012-02-13 5 views
6

radio 버튼과 check-boxes 버튼이있는 양식이 있습니다. 사용자가 radio button 또는 check-box을 선택/선택 취소 할 때마다 다른 입력 필드가 활성화/비활성화됩니다.
사용자가 양식을 제출할 때 사용할 수있는 필드에 대해서만 유효성 검증을 추가하려고합니다. 제출시 사용 중지 된 입력란은 유효성 검사를 위해 고려되어서는 안됩니다.봄의 조건부 유효성 확인

클라이언트 측 유효성 검사에이 값을 추가하고 싶지 않습니다. 유효성 검사기에 을 여러 개 추가하는 대신 Spring 3.0에서 조건 유효성 검사를 구현하는 방법이 있습니까?

감사합니다.

답변

3

필드가 비활성화 된 경우가 전송됩니다 (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> 

: 봄 3.0 솔루션의 경우, 봄이 검사기를 삽입 할 수도 있습니다) 컨트롤러에 null으로 지정하십시오. null 비활성화 됨 필드 또는 not blank 필드, 즉 사용 가능하지만 빈 필드를 허용하는 유효성 검사를 추가하려고합니다.
그래서 null을 허용하는 사용자 정의 주석 NotBlankOrNull을 만들었고 공백이 아닌 빈 문자열도 처리했습니다.
여기 내 주석 나는 또한 내 site에 대한 자세한 내용을 업데이트 한

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

    } 
} 

입니다.

8

JSR 303 Bean 유효성 검사를 사용하는 경우 여기에 validation groups (groups)을 사용할 수 있습니다.

두 개의 섹션이 들어있는이 사용자 입력이 있다고 가정합니다. 섹션이 활성화 또는 비활성화되었는지 나타내는 두 개의 부울입니다. 당신은 그룹에 대한 두 개의 인터페이스를 필요로

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 
} 

(물론 @NotNull보다 더 유용한 주석을 사용할 수 있습니다). 그들은 마커로만 작동합니다.

public interface SectionA{} 

public interface SectionB{} 

Since Spring 3.1 유효성 검증을 트리거 컨트롤러 방법에 (대신 @Validate의) 봄 @Validated 주석을 사용할 수 있습니다

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

+0

정말 좋은 제안 인 것 같습니다. DTO에있는 필드에이 방법을 적용하는 방법에 대해서 궁금합니다. 나는 콩/도메인 objecct에 존재하지 않지만 DTO에 존재하는 몇 가지 필드가 있고 그들에 대한 검증을 추가하고 싶다. – xyz

+0

매우 클래스 인 Entity DTO, ...의 필드에이 javax.validation anntoation (NotNull, ...)을 넣을 수 있습니다. 위 예제에서 UserInput은 DTO 여야합니다 – Ralph