본문 바로가기
Springboot

Spring - @Valid @Requestbody Collection 유효성 검사 하는 법

by hyerann 2020. 3. 30.

@Valid를 사용하여 Controller 단에서 유효성을 검사하고자 했는데 테스트 결과 Controller 단이 아닌 Entity에 접근할때 유효성 에러가 나는 것을 발견하였다.

알아보니 @Valid는 Object 기준이라 Collection일 경우 유효성 검사가 이루어지지 않는 것이었다.

이를 해결하기 위해 아래와 같이 Validator을 커스텀하여 작성한다.

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;

import javax.validation.Validation;
import java.util.Collection;

@Component
public class CustomCollectionValidator implements Validator {

    private SpringValidatorAdapter validator;

    public CustomCollectionValidator() {
        this.validator = new SpringValidatorAdapter(
                Validation.buildDefaultValidatorFactory().getValidator()
        );
    }

    @Override
    public boolean supports(Class clazz) {
        return true;
    }

    @Override
    public void validate(Object target, Errors errors) {
        if(target instanceof Collection){
            Collection collection = (Collection) target;

            for (Object object : collection) {
                validator.validate(object, errors);
            }
        } else {
            validator.validate(target, errors);
        }

    }
}

그리고 Controller에서 인자로 BindingResult를 추가하고

customCollectionValidator.validate(itemSaveRequestDtos, bindingResult);

if(bindingResult.hasErrors()) {
	throw new BindException(bindingResult);
}

@Valid 어노테이션이 아닌 커스텀한 Validator를 사용하여 직접 유효성 검사를 수행하면 Collection 내의 각 Object들에 대한 유효성 검사가 이루어지고 잘못된 요청일 경우 400 에러가 응답으로 내려간다.

댓글