복붙노트

[SPRING] Spring의 조건부 유효성 검사

SPRING

Spring의 조건부 유효성 검사

라디오 버튼과 체크 박스가 포함 된 양식이 있습니다. 사용자가 라디오 버튼을 선택 / 선택 취소 할 때마다 또는 다른 확인란이 활성화 / 비활성화됩니다. 사용자가 양식을 제출할 때 사용할 수있는 필드에 대해서만 유효성 검사를 추가하려고합니다. 제출 당시 사용 중지 된 입력란은 유효성 검사를 위해 고려되어서는 안됩니다.

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

감사!

해결법

  1. ==============================

    1.JSR 303 Bean 유효성 검사를 사용하는 경우 유효성 검사 그룹 (그룹)을 사용할 수 있습니다.

    JSR 303 Bean 유효성 검사를 사용하는 경우 유효성 검사 그룹 (그룹)을 사용할 수 있습니다.

    두 개의 섹션을 포함하는 사용자 입력이 있다고 가정합니다. 섹션이 활성화 또는 비활성화되었는지 나타내는 두 개의 부울입니다. 물론 @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{}
    

    Spring 3.1부터 컨트롤러 메소드에서 @Validate 대신 Spring @Validated 주석을 사용하여 유효성 검사를 트리거 할 수 있습니다.

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

    Spring 3.1 이전에는 유효성 검사에 사용되어야 할 유효성 검사 그룹을 지정하는 방법이 없었기 때문에 (@Validated가 존재하지 않고 @Validate에 그룹 속성이 없기 때문에) 손으로 작성된 코드로 유효성 검사를 시작해야합니다. 마녀 섹션에 의존하여 검증을 트리거하는 예제는 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 : Spring 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>
    

    )

  2. ==============================

    2.필드를 사용할 수 없으면 컨트롤러로 null로 전송됩니다. null 인 비활성화 된 필드 또는 비어있는 필드, 즉 사용 가능하지만 빈 필드를 허용하는 유효성 검증을 추가하려고합니다. 그래서 사용자 정의 주석 NotBlankOrNull을 작성하여 공백을 처리하는 null 및 비어 있지 않은 문자열을 허용합니다. 여기 내 주석이있다.

    필드를 사용할 수 없으면 컨트롤러로 null로 전송됩니다. null 인 비활성화 된 필드 또는 비어있는 필드, 즉 사용 가능하지만 빈 필드를 허용하는 유효성 검증을 추가하려고합니다. 그래서 사용자 정의 주석 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 { };
    }
    

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

    나는 또한 나의 위치에 세부 사항을 더 새롭게했다.

  3. from https://stackoverflow.com/questions/9257673/conditional-validations-in-spring by cc-by-sa and MIT license