Spring MVC使用hibernate Validator来验证单个基本类型

adt*_*ano 14 java spring-mvc hibernate-validator

下面是我遇到问题的映射方法,无论我传递给它的值是什么,验证都返回"通过验证".

@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";
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道@Max适用于我的应用程序,因为我将它用于验证自定义对象,这些对象将大量数据返回给控制器.在这种情况下我只调用@Valid和方法参数中对象的验证类型,它才会运行验证.

hibernate-validator不允许这样做吗?

我希望不必定义一个只包含长值的对象,以便我可以对其进行验证.

Mas*_*ave 3

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

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

另一方面,以编程方式验证基元毕竟不是什么大问题,您的代码可以简单地类似于

@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";
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,在我看来,要么进行程序验证(如果它足够简单),要么简单地包装该值。