7

我正在使用@valid 和@initbinder 来验证传递给服务的数据,但我面临一个@InitBinder仅在全球范围内有效的问题,即

@InitBinder // possible to leave off for global behavior
protected void initBinder(WebDataBinder binder){
    binder.setValidator(new LoginRequestValidator());
}

而不是特定的模型属性,比如我有一个名为 LoginRequest 的模型对象:

@InitBinder("LoginRequest") // possible to leave off for global behavior
protected void initBinder(WebDataBinder binder){
    binder.setValidator(new LoginRequestValidator());
}

在这种情况下,根本没有调用验证器..这是正确的方法吗?还是我错过了什么?

4

2 回答 2

26

查看您的方法的签名,它必须是

@InitBinder("loginRequest")

有一个小 l

的值@InitBinder可以是以下之一

  • 模型属性的名称
  • 请求参数的名称
  • 如果以上都不适用,则可以使用类的名称,但以小写字母开头。这就是 Spring 向模型公开未命名属性的方式。
于 2013-06-27T18:08:09.470 回答
9

@a-better-oliver 的回答很好,但下面是解决 Spring 相同问题的另一种方法,更详细但类型安全:

@InitBinder
protected void initBinder(WebDataBinder binder){
  if (binder.getTarget() != null 
      && LoginRequest.class.equals(binder.getTarget().getClass())) {
    binder.setValidator(new LoginRequestValidator());
  }
}

这样我们不依赖硬编码的字符串,也不关心 Spring 如何暴露未命名的属性。

于 2018-01-12T09:23:59.493 回答