Если вы хотите, чтобы поведение выходило за рамки предоставленных аннотаций, вы можете написать пользовательскую аннотацию, которая может сделать это, например,
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = NotPastValidator.class)
@Documented
public @interface NotPast {
String message() default "date must not be in the past";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Затем:
public class NotPastValidator implements ConstraintValidator<NotPast, LocalDate> {
@Override
public void initialize(final NotPast constraintAnnotation) {
// nothing to do.
}
@Override
public boolean isValid(final LocalDate value, final ConstraintValidatorContext context) {
// As the Bean Validation specification recommends, we consider null values as being valid.
return value == null || isDateNotPast(value);
}
private boolean isDateNotPast(final LocalDate value) {
return ...
}
}
И, наконец, просто аннотировать свое поле:
@NotPast
Конечно, это всего лишь пример с кодом, который я ранее использовал, вам нужно будет адаптироваться к вашим потребностям.
Если вы не хотите использовать валидаторAPI вообще вы можете в равной степени просто написать свой собственный код для программной проверки и генерировать некоторые типы пользовательских исключений, когда они недействительны.Затем это может быть перехвачено в контроллере, и вы можете отправить любой ответ, который вам нужен, например,
@RestController
public class PaymentController {
@PostMapping(value ="/", consumes = APPLICATION_JSON_VALUE)
public void makePayment(@RequestBody final PaymentParams params) {
// validationService.validate(params);
}
@ExceptionHandler(MyValidationException.class)
public ResponseEntity<ExceptionDto> paymentCardException(final MyValidationException e) {
return status(BAD_REQUEST)
.contentType(APPLICATION_JSON)
.body(new ExceptionDto(e.getMessage));
}
}
Я бы сказал, учитывая, что API валидации хорошо поддерживается Spring, для меня имеет смысл применять декларативныйпроверки, где это возможно, при использовании этого стека.Пользовательские правила могут быть немного болезненными, но вы можете использовать многогранный подход с некоторыми аннотациями на основе, и в равной степени вы можете выполнять некоторые более сложные проверки в своем собственном сервисе.