dioleon

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

       考虑了一段时间后,我决定最好的方法是在两层上进行验证。我会解释原因。

假设您有一个 User 实体和一个 name 字段,并且您的应用程序业务逻辑要求该字段不能为空。您还具有 UserDTO 和相同的 name 字段。

我假设您对实体和DTO的所有验证都将使用 java.validation API进行。

如果仅在控制器上进行验证,则可以确保持久保存无效实体,但只能从传入请求中进行。如果您拥有操纵实体的服务,则它可能会在不通知您的情况下将实体保持在无效状态(除非对数据库列进行了空检查)。

       然后,您可以考虑:“好吧,我将验证注释从DTO移到实体上,一切都会好起来的”。。好,是的,不是!

如果仅在实体上进行验证,则无论传入请求还是服务层都不会受到影响,但是您可能会遇到性能问题。

根据 Anghel Leonard 书中的 Spring Boot持久性最佳实践,每次从数据库加载实体时,Hibernate都会浪费内存和CPU来维持实体状态在持久性上下文中,即使实体处于“只读模式”。

现在,考虑一下。如果用户名为空,而您仅在实体上对其进行验证,则意味着您:

  1. 开始交易
  2. 加载了实体
  3. 更改了实体
  4. 刷新了持久性上下文
  5. 回滚交易

       其中许多操作可能会非常昂贵,而您所做的只是将其扔到垃圾箱中,而如果您早先验证了用户名,则根本无法做任何事情。

因此,我的建议是在两层上进行验证。注释使操作变得如此简单,以至于您甚至没有借口不这样做。甚至可以编写自定义验证器来进行复杂的验证,然后可以在许多其他地方重复使用

此外,这是我提到的书的链接,希望您喜欢: https://www.amazon.com.br/dp/B087WS81RK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

posted on 2022-06-01 14:12  dioleon  阅读(47)  评论(0)    收藏  举报