[SPRING] Spring의 조건부 유효성 검사
SPRINGSpring의 조건부 유효성 검사
라디오 버튼과 체크 박스가 포함 된 양식이 있습니다. 사용자가 라디오 버튼을 선택 / 선택 취소 할 때마다 또는 다른 확인란이 활성화 / 비활성화됩니다. 사용자가 양식을 제출할 때 사용할 수있는 필드에 대해서만 유효성 검사를 추가하려고합니다. 제출 당시 사용 중지 된 입력란은 유효성 검사를 위해 고려되어서는 안됩니다.
나는 이것을 클라이언트 측 유효성 검사에 추가하고 싶지 않습니다. 유효성 검사기를 여러 개 추가하는 대신 Spring 3.0에서 조건부 유효성 검사를 구현하는 더 좋고 / 쉬운 방법이 있습니까?
감사!
해결법
-
==============================
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.필드를 사용할 수 없으면 컨트롤러로 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) { } }
나는 또한 나의 위치에 세부 사항을 더 새롭게했다.
from https://stackoverflow.com/questions/9257673/conditional-validations-in-spring by cc-by-sa and MIT license