此端点检查天气作为 url 参数传递的输入日期是否正确。我为此创建了两个自定义验证器。第一个检查日期在语法上是否正确,第二个检查是否在天气的预测范围内。当我在一个验证器失败后有这两个验证器时,程序会转到第二个验证器,当然会有一个错误:// This is to avoid having to add @KtorExperimentalAPI annotations all over the place
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
因为日期在语法上不正确,第二个验证器已经期望正确的日期格式.那么,如果验证第一次失败,我该如何停止进一步验证并在第一次验证后显示错误页面呢?我希望我的问题是可以理解的。
这是我的代码:
MainController.java
"HV000028: Unexpected exception during isValid call."
CorrectDateValidator.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";
}
}
DateWithinForecastValidator.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);
}
}