考虑了一段时间后,我决定最好的方法是在两层上进行验证。我会解释原因。
假设您有一个 User 实体和一个 name 字段,并且您的应用程序业务逻辑要求该字段不能为空。您还具有 UserDTO 和相同的 name 字段。
我假设您对实体和DTO的所有验证都将使用 java.validation API进行。
如果仅在控制器上进行验证,则可以确保持久保存无效实体,但只能从传入请求中进行。如果您拥有操纵实体的服务,则它可能会在不通知您的情况下将实体保持在无效状态(除非对数据库列进行了空检查)。
然后,您可以考虑:“好吧,我将验证注释从DTO移到实体上,一切都会好起来的”。。好,是的,不是!
如果仅在实体上进行验证,则无论传入请求还是服务层都不会受到影响,但是您可能会遇到性能问题。
根据 Anghel Leonard 书中的 Spring Boot持久性最佳实践,每次从数据库加载实体时,Hibernate都会浪费内存和CPU来维持实体状态在持久性上下文中,即使实体处于“只读模式”。
现在,考虑一下。如果用户名为空,而您仅在实体上对其进行验证,则意味着您:
- 开始交易
- 加载了实体
- 更改了实体
- 刷新了持久性上下文
- 回滚交易
其中许多操作可能会非常昂贵,而您所做的只是将其扔到垃圾箱中,而如果您早先验证了用户名,则根本无法做任何事情。
因此,我的建议是在两层上进行验证。注释使操作变得如此简单,以至于您甚至没有借口不这样做。甚至可以编写自定义验证器来进行复杂的验证,然后可以在许多其他地方重复使用
此外,这是我提到的书的链接,希望您喜欢: https://www.amazon.com.br/dp/B087WS81RK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
浙公网安备 33010602011771号