在Java开发中,存在各种"O",如:
- Entity/PO:数据库映射,持久层专用;
- DTO:层间传输数据,按需封装字段;
- VO:前端展示专用,屏蔽敏感信息、格式化数据;
- BO:业务逻辑载体,Service 层专用;
- POJO:所有简单 Java Bean 的统称,是基础。
这里重点说下VO的使用。
VO(View Object,视图对象)
- 核心定义 :专门给前端展示的对象,是前端页面能直接使用的数据格式(屏蔽后端内部结构)。
- 核心特征 :
- 字段与前端页面展示的内容完全匹配(如格式化时间、拼接字段);
- 不含敏感字段(如密码、用户手机号脱敏);
- 可能包含前端需要的计算字段(如订单状态描述、金额单位)。
- 使用场景:Controller 层返回给前端的最终数据对象。
那么VO 的边界在哪?
必须用 VO 的情况
-
字段来自 多张表
-
字段是 计算值 / 聚合值
-
返回结构 ≠ 表结构
-
一个字段对应多个源
不需要 VO 的情况
-
只是 字段重命名
-
只是 JSON key 不一致
-
表结构与返回结构一致
清楚这个边界,能有效防止各种O的滥用。
如果只有个别字段跟前端要求不一样,为了给前端提供所需的JSON key,可以在实体类对应属性上添加注解:@JsonProperty。
比如前端需要返回desc(描述的缩写),但在mysql中desc,是关键字,把字段声明为desc程序运行会报错,除了该属性,其他字段属性跟前端要求的JSON大致一样,这种情况就不适用VO,我们只需在实体类上这样处理:
java
@JsonProperty("desc")
private String description;