Custom Validator

지니🧸·2023년 3월 3일
0

삽질 저장소

목록 보기
5/16

기본적으로 제공되는 validation constraint (@Size, @Length, @Column() 등)이 충분치 않을 수 있다. 그럴 때는 커스텀으로 만들면됨

필드 단위에서 적용하는 constraint

아이디에 영어와 숫자 모두 포함되는지

interface

@Target( { ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = IncludeCharIntValidator.class)
public @interface IncludeCharInt {

    //error message
    public String message() default "The username must include alphabets and numbers.";
    //represents group of constraints
    public Class<?>[] groups() default {};
    //represents additional information about annotation
    public Class<? extends Payload>[] payload() default {};

}

implementation

public class IncludeCharIntValidator implements ConstraintValidator<IncludeCharInt, String> {
    char[] chars;

    @Override
    public void initialize(IncludeCharInt constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        chars = value.toCharArray();
        for (char c : chars) {
            if (Character.isLetter(c) || Character.isDigit(c)) {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
}

클래스 단위에서 적용하는 constraint

유저의 비밀번호와 비밀번호 확인 값이 일치하는지

@Target({TYPE,ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordMatchesValidator.class)
@Documented
public @interface PasswordMatches {
    String message() default "Passwords don't match";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Implementation

public class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object> {
    @Override
    public void initialize(PasswordMatches constraintAnnotation) {
    }

    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext context){
        if (obj.getClass().equals(SignupDto.class)) {
            return validateSignupDto(obj);
        }
        if (obj.getClass().equals(UpdateUserDto.class)) {
            return validateUpdateUserDto(obj);
        }
        return false;
    }

    public boolean validateSignupDto(Object obj) {
        SignupDto user = (SignupDto) obj;
        return user.getPassword().equals(user.getConfirmPassword());
    }
    public boolean validateUpdateUserDto(Object obj) {
        UpdateUserDto user = (UpdateUserDto) obj;
        if (!user.passwordChanged()) {
            return true;
        }
        return user.getPassword().equals(user.getConfirmPassword());
    }

}

참고: Spring MVC Custom Validation

profile
우당탕탕

0개의 댓글