带有休眠验证器的弹簧MVC,用于验证单个基本类型

2022-09-04 04:16:32

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

@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和对象的验证类型。

休眠验证器不允许这样做吗?

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


答案 1

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

恕我直言,定义包装bean是最明智的举动,因为hibernate-validator完全以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";
  }
}

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


答案 2

不,这是不允许的。我明白你的观点,但是JSR-303规范(休眠验证器实现)是用于bean验证的,请参阅此处


推荐