【问题标题】:hibernate / spring validation in service layer服务层中的休眠/弹簧验证
【发布时间】:2010-11-25 11:37:16
【问题描述】:
---添加(编辑)--
是否应该在服务层进行验证,即使您在前端进行验证?
例如,struts 具有验证功能,因此您可以对其进行大量验证。 (我不是指 Java 脚本验证。)
--
您是否在服务层中使用休眠验证器或弹簧验证,即使您已经在前端进行了验证?
(前端验证不必是hibernate或spring one)
【问题讨论】:
标签:
java
design-patterns
architecture
【解决方案1】:
一致的数据是企业应用程序中最重要的事情之一!
所以是的:您需要检查两次:在前端和服务层。
在我们的 Web 应用程序中,我们在不同级别有不同的检查:
(我不是在谈论不一致的检查,我是在谈论检查的粒度和范围。)
- 输入字段的 Java 脚本检查(最大长度,非空...)
- 与 (1) 相同的检查以及服务器端 Web 控制器中的一些更复杂的检查
- 在实体和服务中检查会破坏应用程序逻辑的重要(有时是复杂的)约束
- 数据库可以轻松检查的所有内容(非空、外键、唯一)都由数据库约束检查。
IHO 最好到处检查,但这是不可能的。所以你需要一个一致的政策来检查什么。此政策很大程度上取决于您正在开发的应用程序类型。
【解决方案2】:
我们将它与 wicket 结合使用作为前端框架。您必须考虑需要分两步进行验证:
- 验证输入,例如:是否为整数
- 根据业务逻辑进行验证
我们使用业务验证在检票口内进行验证解决了这个问题。所以你不必写两次代码。
【解决方案3】:
您的问题不够具体,即它看起来不能解决单个问题(更像是一项民意调查)。
要回答更具体的问题“即使您在前端进行验证,您是否应该在服务层进行验证?”,答案是肯定的。几乎所有的前端验证,尤其是对于 web 应用程序,都可以绕过。您的服务应实施适当的验证以确保它们是一致的,并且不应依赖用户空间中的验证(如 Javascript 检查),因为它们很容易被击败。
更新:当决定在代码的前端(调度程序/控制器)和服务层之间进行验证时,我想说没有硬性规定。我可能会在前端检查我们收到的输入是否合理,并在服务层进行域级验证。
【解决方案4】:
我强烈建议使用 Hibernate Validator 并将所有验证保存到模型中。它对 Oops 封装起到了很好的推动作用,因为模型现在可以自我验证。