Пользовательский интерфейс аннотации валидатора перечисления:
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = PanTypeSubSetValidator.class)
public @interface PanTypeSubset {
PanType[] anyOf();
String message() default "must be any of {anyOf}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
и фактическая реализация:
public class PanTypeSubSetValidator implements ConstraintValidator<PanTypeSubset, PanType> {
private PanType[] subset;
@Override
public void initialize(PanTypeSubset constraint) {
this.subset = constraint.anyOf();
}
@Override
public boolean isValid(PanType value, ConstraintValidatorContext context) {
return value == null || Arrays.asList(subset).contains(value);
}
}
и использование внутри запроса DTO:
@SuperBuilder
@Data
@NoArgsConstructor
public class PanBaseRequestDto {
@NotNull(message = "'PANTYPE' cannot be empty or null")
@PanTypeSubset(anyOf = {PanType.PAN, PanType.TOKEN}, message = "yesssss")
private PanType panType;
}
Проблема в том, что эта аннотация никогда не срабатывает. Я получаю еще одно исключение в реализации @RestControllerAdvice DefaultExceptionHandler перед этой фактической проверкой:
Handling generic exception: (Invalid JSON input: Cannot deserialize value of type `...pantoken.PanType` from String "PAN1": not one of the values accepted for Enum class: [TOKEN, PAN]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `...pantoken.PanType` from String "PAN1": not one of the values accepted for Enum class: [TOKEN, PAN]