2017-10-02 5 views
2

나는 스프링을 사용하여 양식의 유효성을 검사하고 있습니다. 양식의 모델은 다음과 유사합니다.여러 구속 조건 스프링 유효성 확인

public class FormModel { 

    @NotBlank 
    private String name; 

    @NotNull 
    @ImageSizeConstraint 
    private MultipartFile image; 

} 

'@ImageSizeConstraint'는 사용자 정의 제약 조건입니다. 내가 원하는 것은 @NotNull이 먼저 평가되고 이것이 false로 평가되면 @ImageSizeConstraint를 평가하지 않는 것입니다.

이것이 가능하지 않은 경우 맞춤 제약 조건에서도 null을 확인해야합니다. 어떤 문제는 아니지만 문제 (null/image size/image/aspectratio/등이 아닌)와 구분하고 싶습니다.

+0

사용자 정의 제약 조건에서 ** NotNull **을 코딩하는 것은 어떻습니까? –

+0

가능하지만 관심사를 구분하고 싶습니다. –

답변

1

제약 순서 및 그룹 순서를 사용하여 유효성 검사 순서를 정의 할 수 있습니다. JSR-303 상기 (. 일부 3.5 유효성 루틴은)

그룹 시퀀스로 정렬되지 않는

그룹 없이 특정 순서로 검증 될 수있다. 이는 유효성 검사 루틴이 동일한 패스의 여러 그룹에 대해 으로 실행될 수 있음을 의미합니다. 최대 절전 모드 검사기 documentation으로

는 말한다 :

그냥 그룹이 순서 를 정의 에게 인터페이스를 정의하고 @GroupSequence로 주석을 필요로 이러한 검증 순서를 구현하기 위해

유효성을 검사합니다 (그룹 정의 시퀀스 참조). 시퀀스 그룹에서 적어도 하나의 제약 조건이 실패하면 시퀀스에서 다음 그룹의 제약 조건 중 의 유효성을 검사하지 않습니다. 제약 특별한 순서없이 평가로 그들이 (Default 그룹에 속하는 그룹에 관계없이, 다음

public interface CheckItFirst {} 

public interface ThenCheckIt {} 

public class FormModel { 

    @NotBlank 
    private String name; 

    @NotNull(groups = CheckItFirst.class) 
    @ImageSizeConstraint(groups = ThenCheckIt.class) 
    private MultipartFile image; 
} 

그리고 첫째

, 당신은 제약 그룹을 정의하고 제약에 적용해야 너무), image 필드 제약 그룹에 대해 @GroupSequence을 만들어야합니다.

@GroupSequence({ CheckItFirst.class, ThenCheckIt.class }) 
public interface OrderedChecks {} 

당신은 당신이 메소드 레벨의 검증을 위해 검증 그룹을 지정할 수는 @Validated 주석을 사용할 수 있습니다, 스프링 MVC 컨트롤러 방법이 검증을 적용하려면

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<FormModel>> constraintViolations = 
          validator.validate(formModel, OrderedChecks.class); 

그것을 테스트 할 수

@PostMapping(value = "/processFormModel") 
public String processFormModel(@Validated(OrderedChecks.class) FormModel formModel) { 
    <...> 
} 
+0

아마도 Spring MVC에 컨트롤러가 이것을 사용하기 위해 @Validated ({CheckItFirst.class, ThenCheckIt.class})를 사용해야한다는 것을 추가하는 것이 좋다. –

+1

스프링 MVC 컨트롤러 예제가 추가되었습니다. Hibernate 유효성 검사기는 유효성 검사 루틴에서 @Validated 인수 순서를 유지하는 것처럼 보이지만 JSR-303이 유효성 검사 순서를 정의하는 유일한 방법이라고 말한 것처럼 시퀀스를 사용해야합니다. –