기본적으로 제공되는 validation constraint (@Size
, @Length
, @Column()
등)이 충분치 않을 수 있다. 그럴 때는 커스텀으로 만들면됨
아이디에 영어와 숫자 모두 포함되는지
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;
}
}
유저의 비밀번호와 비밀번호 확인 값이 일치하는지
@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());
}
}