Проверки JSR не работают с настраиваемой пружинной загрузкой валидатора - PullRequest
0 голосов
/ 09 декабря 2018

У меня простое REST-приложение с весенней загрузкой.Вот как выглядит DTO:

@Data
public class FooDto {
@Min(value = 0L)
@NotNull
private final String amount;

@ValidTimestamp
private final String timestamp;
}

У меня есть некоторая логика проверки в @ValidTimestamp, проверяющая формат отметки времени, действительный или нет.но проблема в том, что момент, который я поместил здесь @ValidTimestamp, все остальные проверки JSR по умолчанию во всем DTO перестают работать.Они вообще не запускаются.Если я закомментирую @ValidTimestamp, тогда эти проверки JSR по умолчанию станут активными.Я искал по всему интернету, но не мог найти никакого решения.Оцените быстрые указатели.

Вот класс валидатора:

public class TimestampValidator implements ConstraintValidator<ValidTimestamp, String> {

@Override
public void initialize(@NonNull final ValidTimestamp constraintAnnotation) {
    constraintAnnotation.payload();
}

@Override
public boolean isValid(final String timestamp,
                       @NonNull final ConstraintValidatorContext constraintValidatorContext) {
    try {

        final Duration duration = Duration.between(Instant.parse(timestamp), Instant.now());
        throwIfOldTimeStampProvided(duration);
        throwIfFutureTimestampProvided(duration);
    } catch (DateTimeParseException dateTimeParseException) {
        return throwInvalidTimestampFormatException(dateTimeParseException);
    }
    return true;
}

private boolean throwInvalidTimestampFormatException(@NonNull final DateTimeParseException dateTimeParseException) {
    log.error("failed to parse the timestamp, exception is : {}", dateTimeParseException);
    throw new InvalidTimestampFormatException("invalid timestamp supplied via request");
}

private void throwIfOldTimeStampProvided(@NonNull final Duration duration) {
    if (duration.toMillis() > ACTIVE_TRANSACTION_TIME_REFERENCE * 1000) {
        throw new StaleTransactionException("Transaction time is  more than a minute ago");
    }
}

private void throwIfFutureTimestampProvided(@NonNull final Duration duration) {
    if (duration.isNegative()) {
        throw new FutureTransactionException("Transaction time is of future");
    }
}
}

А вот аннотация:

@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = {TimestampValidator.class})
public @interface ValidTimestamp {
    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
...