【问题标题】:Is it possible to validate @RequestParam in Spring MVC REST endpoint?是否可以在 Spring MVC REST 端点中验证 @RequestParam?
【发布时间】:2014-07-05 03:59:54
【问题描述】:

在 Jersey 2 中可以这样做:

@GET
@PATH("user/{email}")
public IDto getUser(@NotNull @Email @PathParam("email") String validEmail) {
    return userManagementService.findUserByEmail(validEmail);
}

但我无法在 Spring MVC 中进行类似的工作,似乎只有在 @RequestBody 中提供对象或使用 SpringMVC 表单时才进行验证,例如以下内容不起作用:

@RequestMapping(value="/user/{email}", method = RequestMethod.GET)
public @ResponseBody IDto getUser(@NotNull @Email @PathVariable String validEmail) {
    return userManagementService.findUserByEmail(validEmail);
}   

还有其他类似的问题,但这些问题似乎面向 Spring MVC UI 应用程序,在我的情况下,它只是一个返回 JSON 响应的 REST API,所以我没有任何视图可以映射/绑定到控制器。

【问题讨论】:

  • 您至少需要使用 @Valid 进行注释,尽管这可能仅在您有模型类而不只是 String 时才有效。
  • 是的,问题是关于简单参数而不是关于作为输入的 POJO 对象,因为我知道 @Valid 注释将使用类中注释中的 bean 验证。但这不是我要求的功能

标签: java spring spring-mvc


【解决方案1】:

似乎有可能,使用@Validated

这是example

【讨论】:

  • 除了链接之外,能否请您添加一个sn-p,以便即使链接断开也更容易理解答案?
  • @Validated添加到所需的控制器类或方法中足以触发验证。
  • 在我的情况下默认情况下不适用于 @Validated 注释。
【解决方案2】:

1- 只需在类的顶部添加 @Validated 注释。 2- 在方法签名中的 @RequestParam 注释之前放置任何用于验证的注释(@NotBlank、Min(1) 等)。

【讨论】:

    【解决方案3】:

    据我所知,你不能用 Spring 开箱即用地做到这一点。

    选项:

    1. 使用正则表达式:

      @RequestMapping(value="/user/{email:SOME_REXEXP}", method = RequestMethod.GET)
      public @ResponseBody IDto getUser(@PathVariable String validEmail) {
          return userManagementService.findUserByEmail(validEmail);
      }   
      
    2. 使用 Hibernate Validator 来验证方法。手动调用验证器,或者让 Spring 使用 AOP 为您调用它。见https://github.com/gunnarmorling/methodvalidation-integration

    【讨论】:

      【解决方案4】:

      控制器应该用spring的@Validated注解

      所以更新你的代码

      @Validated
      @RequestMapping(value="/user/{email}", method = RequestMethod.GET)
      public @ResponseBody IDto getUser(
          @NotNull 
          @Email 
          @PathVariable String validEmail) {
          return userManagementService.findUserByEmail(validEmail);
      }
      

      【讨论】:

        【解决方案5】:

        来自org.springframework.validation.annotation.Validated 包的已验证注解用于验证@PathVariable。确保使用 @Validated 注释的类。

        @GetMapping("/name-for-day/{dayOfWeek}")
          public String getNameOfDay(@PathVariable("dayOfWeek") @Min(1) @Max(7) Integer dayOfWeek) {
                return dayOfWeek + "";
        }
        

        【讨论】:

          猜你喜欢
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-01
          • 1970-01-01
          • 2020-07-25
          • 2017-06-28
          • 2019-03-24
          相关资源
          最近更新 更多