Enum를 사용하여 enum에서 특정 값은 post 요청 시 사용되는 안되는 값이 있어서 해당 값으로 post 요청이 들어오면 예외처리를 하는 custom validation을 구현했습니다.
@Getter
@RequiredArgsConstructor
public enum TransactionAction {
TOTAL("TOTAL","전체"),
GIVING("GIVING", "준"),
RECEIVING("RECEIVING", "받은");
private final String key;
private final String title;
}
여기서 TOTAL을 예외처리 할 겁니다!
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ActionValidator.class)
public @interface ActionValid {
String message() default "잘못된 거래 종류";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
어노테이션을 사용하여 validation할 예정이므로 인터페이스를 만들어줍니다 default message를 적어줘서 호출부에서는 더 깔끔하게 사용할 수 있습니다. 또 field에서 사용할 것이므로 Field만 적어놨습니다. 만약 더 범용적인 어노테이션을 만들고싶으면 ElementType에서 원하는 위치를 찾아서 사용하시면됩니다.
public class ActionValidator implements ConstraintValidator<ActionValid, TransactionAction> {
@Override
public boolean isValid(TransactionAction action, ConstraintValidatorContext context) {
if (action == null) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("action is required").addConstraintViolation();
return false;
}
return !action.equals(TransactionAction.TOTAL);
}
}
실제 구현부입니다. ConstraintValidator를 사용하여 validation을 진행했습니다. custom validation을 사용하여 추가로 NotNull같은 어노테이션이 안먹어서 같이 null check도 해주었습니다!
내용만 보면 금방 하는 내용인데 테스트를 계속 서버에서 해서 20분은 잡아 먹었네요....
다들 스웨거 사용하실 때 url 한 번씩 봐주세요..!