正则表达式验证不会在 Spring Boot 控制器中触发错误

Fel*_*wer 5 java rest spring spring-boot

当设置日期输入(required = false)但使用错误的正则表达式(fe 10-2019)时,我希望我的 RestController 返回错误

  @GetMapping
  @Timed
  public ResponseEntity<ResponseBodyWrapper<List<ListData>>> getList(
     @RequestParam(name = "date", required = false) @Pattern(regexp = "[0-9]{4}-[0-9]{1,2}") String date) {
    // Logic
  }
Run Code Online (Sandbox Code Playgroud)

但是,验证并未进行。我期待一个错误,但没有抛出任何错误,当我尝试使用错误的输入构建一个新对象时,错误发生了

cas*_*lin 5

修复验证@Validated

\n\n

当您希望触发验证时,控制器类必须使用以下注释@Validated

\n\n
@Validated\n@RestController\npublic class MyController {\n   ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

引用文档

\n\n
\n

为了符合 Spring 驱动的方法验证的条件,所有目标类都需要使用 Spring\xe2\x80\x99s@Validated注释进行注释。

\n
\n\n

不要使用@Timed

\n\n

我发现你的控制器方法用 注释这一事实很奇怪@Timed。这是特定于测试的注释,并不意味着在实际代码中使用:

\n\n
\n

特定于测试的注释,指示测试方法必须在指定时间段内完成执行。

\n
\n\n

您可能还想检查您的依赖项并确保它们使用正确的范围。

\n\n

考虑YearMonth而不是String

\n\n

由于您似乎在控制器方法中收到了年份和月份值,因此最好使用YearMonth而不是String

\n\n
\n

ISO-8601 日历系统中的年月,例如2007-12

\n
\n\n

你的控制器方法可以是这样的:

\n\n
@GetMapping\npublic ResponseEntity<Foo> getList(@RequestParam(name = "date", required = false) YearMonth date) {\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n