具有hibernate验证器的Spring MVC来验证单个基本类型


问题内容

下面是我遇到麻烦的映射方法,无论我传递给它什么值,验证都会返回“已通过验证”。

@RequestMapping(value = "test", method = RequestMethod.POST)
@ResponseBody
public String getTest(@RequestBody @Valid @Max(32) long longValue, BindingResult result) {
  if (result.hasErrors()) {
    return "failed validation";
  } else {
    return "passed validation";
  }
}

我知道@Max可与我的应用程序一起使用,因为我将其用于对将大量数据返回到控制器的自定义对象进行验证。在这种情况下,它不会运行验证,在这种情况下,我将调用@Valid并在方法参数中对对象进行验证的类型。

hibernate-validator不允许这样做吗?

我希望不必定义仅包含长值的对象,以便可以对其进行验证。


问题答案:

我希望不必定义仅包含长值的对象,以便可以对其进行验证。

定义包装的bean是恕我直言,这是最明智的做法,因为hibernate-
validator完全以bean的概念为中心,并且毕竟是bean验证规范的参考实现。规范的主要推动力之一是承认验证是跨越不同应用程序层的跨领域关注点,并提供一种优雅地处理此问题的机制。这就是为什么它以bean为中心的原因,bean是通过层传递的对象。

另一方面,以编程方式验证primitves毕竟不是什么大不了的事情,您的代码可以像

@RequestMapping(value = "test", method = RequestMethod.POST)
@ResponseBody
public String getTest(@RequestBody long longValue, BindingResult result) {
  if (longValue > 32) {
     result.rejectValue("longValue", "error.longValue", "longValue max constrained failed");
    return "failed validation";
  } else {
    return "passed validation";
  }
}

因此,在我看来,要么简单地进行程序验证,要么简单地包装值。