如果第一次失败,Spring Boot 将停止执行第二个验证器

时间:2021-01-05 12:26:32

标签: java spring spring-boot

此端点检查天气作为 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);
    }
}

0 个答案:

没有答案
相关问题