刚开始学习 Spring Boot 的时候,我对 DTOs(数据传输对象)和 Entities(实体类)没有太深入的思考。通常的做法就是创建一个类,然后到处使用——数据库操作、API 接口、业务服务等等。看起来一切都很顺利……直到问题出现。
在这篇文章中,我想分享一下关于 DTOs 和 Entities 的一些经验教训。我会解释它们各自的作用,为什么需要将它们分离,以及忽略这一点会带来哪些实际问题。
最初的错误做法
在某个项目的初期,我创建了一个 User
类,包含 id
、name
、email
和 password
等字段。然后在以下所有场景中都使用这同一个类:
- 数据库持久化(作为 JPA 实体)
- 接收前端传递的数据
- 返回 API 响应结果
开发速度确实很快,代码量也不多。但随着项目的发展,问题逐渐暴露出来。
问题的出现
有一天,产品经理提出了新需求:前端需要展示用户的公开资料,但不能包含邮箱和密码信息。
听起来很简单,对吧?
但问题是,我的 API 直接返回完整的 User
实体对象,响应中包含了敏感数据,比如密码哈希值。
我们只能临时用 @JsonIgnore
注解来解决,但接下来另一个确实需要返回邮箱的 API 又出现了问题。
这时候才意识到,一个类已经无法满足所有需求了。
DTO 的解决方案
我创建了一个新的 UserDTO
类,只包含需要在响应中返回的字段——比如 id
、