Ten punkt końcowy sprawdza, czy data wejściowa przekazana jako parametr adresu URL jest poprawna, czy nie. W tym celu stworzyłem dwa niestandardowe walidatory. Pierwszy sprawdza, czy data jest poprawna składniowo, a drugi, czy mieści się w zakresie prognozy pogody. Kiedy po niepowodzeniu jednego, program przechodzi do drugiego walidatora oczywiście pojawia się błąd: „HV000028: Nieoczekiwany wyjątek podczas wywołania isValid”. ponieważ data nie jest poprawna składniowo i dochodzi do drugiego walidatora, który już oczekuje poprawnego formatu daty i tego właśnie chcę uniknąć. Jak więc mogę przerwać dalszą walidację i po pierwszej walidacji pokazać stronę błędu w tym momencie, jeśli walidacja najpierw się nie powiedzie? To właśnie pierwszy walidator ma za zadanie wyłapać błędną datę Mam nadzieję, że mój problem jest zrozumiały.
Oto mój kod.
MainController.java
@RestController
@Validated
@RequestMapping("/")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
@ComponentScan("pl.jawegiel")
public class MainController {
@GetMapping(path = "/bestLocation/{paramDay}")
String getBestLocation(@PathVariable(value = "paramDay") @CorrectDate @DateWithinForecast String paramDay) {
return "valid";
}
}
CorrectDateValidator.java
public class CorrectDateValidator implements ConstraintValidator<CorrectDate, String> {
private static final int PROPER_NUMBER_OF_DASHES = 2;
public static final String DATE_REGEX = "^\\d{4}[\\-/\\s]?((((0[13578])|(1[02]))[\\-/\\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\\-/\\s]?(([0-2][0-9])|(30)))|(02[\\-/\\s]?[0-2][0-9]))$";
public void initialize(CorrectDate constraint) {
}
public boolean isValid(String date, ConstraintValidatorContext context) {
return (date.matches(DATE_REGEX)) && (date.length() - date.replace("-", "").length() == PROPER_NUMBER_OF_DASHES);
}
}
DateWithinForecastValidator.java
public class DateWithinForecastValidator implements ConstraintValidator<DateWithinForecast, String> {
private static final int ALLOWED_NUMBER_OF_DAYS = 15;
private static final int NO_DIFFERENCE_BETWEEN_TODAY_AND_DATE_FROM_PARAM = 0;
public void initialize(DateWithinForecast constraint) {
}
public boolean isValid(String date, ConstraintValidatorContext context) {
LocalDate dateFromParamDay = LocalDate.parse(date);
LocalDate today = LocalDate.now();
LocalDate after16Days = today.plus(ALLOWED_NUMBER_OF_DAYS, ChronoUnit.DAYS);
return today.compareTo(dateFromParamDay) * dateFromParamDay.compareTo(after16Days) >= NO_DIFFERENCE_BETWEEN_TODAY_AND_DATE_FROM_PARAM;
}
}