【问题标题】:Regex Validation not triggering an Error in Spring Boot Controller正则表达式验证不会在 Spring Boot 控制器中触发错误
【发布时间】:2020-01-14 02:42:29
【问题描述】:

我希望我的 RestController 在设置日期输入时返回错误(必需 = false)但使用错误的正则表达式(例如 10-2019)

  @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
  }

但是,验证没有发生。我期待一个错误,但没有抛出,错误发生在后来,当我尝试使用错误的输入构建一个新对象时

【问题讨论】:

    标签: java spring rest spring-boot


    【解决方案1】:

    使用@Validated 修复验证

    当你想触发验证时,控制器类必须用@Validated注解:

    @Validated
    @RestController
    public class MyController {
       ...
    }
    

    引用documentation

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

    不要使用@Timed

    我觉得很奇怪你的控制器方法用@Timed 注释。这是一个特定于测试的注释,并不打算在实际代码中使用:

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

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

    考虑YearMonth 而不是String

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

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

    你的控制器方法可以是:

    @GetMapping
    public ResponseEntity<Foo> getList(@RequestParam(name = "date", required = false) YearMonth date) {
        ...
    }
    

    【讨论】:

    • 谢谢@Validated工作我们没有使用org.springframework.test.annotation@Timed进行测试我们使用io.micrometer.core.annotation@Timed我们的Grafana非常感谢你,我们现在使用YearMonth 而不是String,这样更可靠和可重用。唯一一点,因为我们不使用 ISO 标准,所以我们必须使用正则表达式实现模式转换器:^(\\d{4})-(1[0-2]|[1-9]|0[1-9])$
    【解决方案2】:

    你需要在类中添加@Validated注解:

    @RestController
    @Validated
    public class myRestController{
    
    @Timed
      public ResponseEntity<ResponseBodyWrapper<List<ListData>>> getList(
         @RequestParam(name = "date", required = false) @Pattern(regexp = "[0-9]{4}-[0-9]{1,2}") String date) {
        // Logic
      }
    }
    

    参考:https://www.baeldung.com/javax-validation-method-constraints 第 3 点。

    【讨论】:

    • 不幸的是对我不起作用,仍然是相同的行为
    • 您的控制器类是否已注释为 @Validated ?你能试试这个改变吗?正如我在我的答案中编辑的那样,如果您在课堂上使用 @Validated,则不需要 @Valid 注释
    • 是的,谢谢,这就是问题所在,忘记了@Validated 注释
    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2011-01-31
    • 1970-01-01
    • 2019-05-21
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多