我们都知道,Spring MVC 与 Hibernate Validator 和 JSR-303 集成得很好。但是,正如有人所说,Hibernate Validator 只是 Bean Validation 的东西,这意味着应该将更复杂的验证推到数据层。此类验证的示例:业务密钥唯一性、记录内依赖性(这通常指向数据库设计问题,但我们都生活在一个不完美的世界中)。甚至像字符串字段长度这样的简单验证也可能由一些 DB 值驱动,这使得 Hibernate Validator 无法使用。
所以我的问题是,Spring、Hibernate 或 JSR 是否提供了一些东西来执行如此复杂的验证?是否有一些既定的模式或技术可以在基于 Spring 和 Hibernate 的标准 Controller-Service-Repository 设置中执行此类验证?
更新:让我更具体一点。例如,有一个表单向控制器的save
方法发送 AJAX 保存请求。如果出现一些验证错误——无论是简单的还是“复杂的”——我们应该用一些 json 指示有问题的字段和相关错误返回浏览器。对于简单的错误,我可以从中提取字段(如果有)和错误消息BindingResult
。对于“复杂”错误,您会建议什么基础设施(可能是特定的,而不是临时例外?)?使用异常处理程序对我来说似乎不是一个好主意,因为在save
方法之间分离单个验证过程@ExceptionHandler
会使事情变得复杂。目前我使用一些临时异常(如,ValidationException
):
public @ResponseBody Result save(@Valid Entity entity, BindingResult errors) {
Result r = new Result();
if (errors.hasErrors()) {
r.setStatus(Result.VALIDATION_ERROR);
// ...
} else {
try {
dao.save(entity);
r.setStatus(Result.SUCCESS);
} except (ValidationException e) {
r.setStatus(Result.VALIDATION_ERROR);
r.setText(e.getMessage());
}
}
return r;
}
你能提供一些更优化的方法吗?