【问题标题】:How should I validate dependent parameters in @requestparam in spring Rest API?我应该如何在 Spring Rest API 中验证 @requestparam 中的依赖参数?
【发布时间】:2026-02-12 12:30:01
【问题描述】:

我知道春季有验证器。但是,这些验证器只能绑定到单个对象。在请求正文中说一个 Pojo。但是,我有一个场景,我有一个获取请求并且我想验证一个日期范围:我有一个开始日期和结束日期为@requestparams。我应该如何验证这些?

还有一个验证器应用于相同的@restcontroller:对于发布请求,例如Employeevalidtor。我可以为同一个 @restcontroller 中的不同对象调用多个验证器吗?

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:

    您可以使用单独的验证器,但它们必须通过传递要验证的相应对象手动实例化。

    【讨论】:

    • 所以我可以将一个employeevalidator 绑定到在request 参数中传递的employeedto。在@restcontroller get 方法中,对于请求参数,我可以使用这些请求参数创建一个点。这个 daterangedto 可以有一个验证器。它确实验证了日期范围并在验证器的 validate 方法中添加了错误。但它没有抛出错误的请求错误并继续处理。如果你有一个例子,你能提供吗?
    【解决方案2】:

    我假设您在谈论请求绑定验证。使用 @RequestParam 和 @PathVariables 的 Spring Validators 可以获得相同的验证,如 this post 中所述

    在此处添加相关部分。控制器将如下所示:

    @RestController
    @Validated
    public class RegistrationController {
    @RequestMapping(method = RequestMethod.GET,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE
    )
    @ResponseStatus(HttpStatus.OK)
    public Map search(@Email @RequestParam("email") String email) {
        return emailMessage(email);
    }
    }
    

    注意类级别的@Validated 方法(也可以在方法级别声明)。

    【讨论】:

      【解决方案3】:

      让 Spring MVC 将您的请求参数映射到封装所有相关输入的 pojo,然后为其添加验证器。

      @RestController
      @RequestMapping("/myUrl")
      public class MytController {
          private final MyIntervalValidator validator;
      
          @InitBinder
          public void initBinder(WebDataBinder binder){
              binder.setValidator(validator);
          }
      
          @GetMapping
          public void doSomthing(@Valid @RequestParam MyInterval interval){...}
      
      class MyInterval implements Serializable{
          private Date startDate;
          private Date endDate;
      }
      
      import org.springframework.validation.Validator;
      class MyIntervalValidator implements Validator{
          @Override
          public boolean supports(Class<?> clazz) {
              return MyInterval.class.isAssignableFrom(clazz);
          }
      
          @Override
          public void validate(Object target, Errors errors) {
              final MyInterval params = (MyInterval) target;
              ....
          }
      }
      

      【讨论】:

        最近更新 更多