首先,正如其他答案所述,Hibernate Validator 不允许像问题中的示例那样直接验证原语。为了使用 Hibernate Validator,定义一个包含 long 值的新类正是使用 Hibernate Validator 所需要的。
第二,也是最重要的,虽然程序验证是可行的,而且非常简单,但它并不干净和可维护。让我用一些例子来说明这一点:
@RequestMapping(value = "testA", method = RequestMethod.POST)
@ResponseBody
public String getTestA(@RequestBody long longValue, BindingResult result) {
if (longValue > 32) {
result.rejectValue("longValue", "error.longValue", "longValue max constrained failed");
return "failed validation for test A";
} else {
return "passed validation for test A";
}
}
@RequestMapping(value = "testB", method = RequestMethod.POST)
@ResponseBody
public String getTestB(@RequestBody long longValue, BindingResult result) {
if (longValue > 32) {
result.rejectValue("longValue", "error.longValue", "longValue max constrained failed");
return "failed validation for test B";
} else {
return "passed validation for test B";
}
}
@RequestMapping(value = "testC", method = RequestMethod.POST)
@ResponseBody
public String getTestC(@RequestBody long longValue, BindingResult result) {
if (longValue > 32) {
result.rejectValue("longValue", "error.longValue", "longValue max constrained failed");
return "failed validation for test C";
} else {
return "passed validation for test C";
}
}
首先要注意的是,有3个简单的函数,所有的验证码都是重复的。
其次,如果在某个时候您的验证要求发生了变化,并且现在所有长值必须大于 35,您需要更改每个验证函数,在这个示例中非常简单,因为只有 3 个函数相同的验证,但想象一下,有 100 个函数在其中执行相同的验证,这很痛苦。
因此,只需定义一个具有长值和验证注释的新类,并在每个方法上使用该类,您就消除了代码重复,而且当您的验证要求发生变化时,在一个地方应用更改,您就可以做到代码。
此外,必须为一项特定任务定义类并没有错,事实上,这正是 Single Responsability Principle 告诉您要做的。
编辑:添加了指向 SRP 描述的链接。