news 2026/5/1 10:23:51

Entity类转换为VO类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Entity类转换为VO类

1. 基础实现(手动转换)

package com.itheima.miniblog.vo; import lombok.Data; @Data public class UserVo { private Integer id; private String username; // 脱敏的手机号 private String mobile; private String avatar; // 状态文本 private String statusText; /** * 构造方法:从 User 实体转换 */ public UserVo(Integer id, String username, String mobile, String avatar, Integer status) { this.id = id; this.username = username; this.mobile = maskMobile(mobile); // 脱敏处理 this.avatar = avatar; this.statusText = convertStatusText(status); } /** * 手机号脱敏方法 * 将 13812345678 转换为 138****5678 */ private String maskMobile(String mobile) { if (mobile == null || mobile.length() != 11) { return mobile; } return mobile.substring(0, 3) + "****" + mobile.substring(7); } /** * 状态转换方法 */ private String convertStatusText(Integer status) { if (status == null) return "未知"; switch (status) { case 0: return "禁用"; case 1: return "正常"; case 2: return "锁定"; case 3: return "待激活"; default: return "未知"; } } }

2. 使用 Builder 模式(推荐)

package com.itheima.miniblog.vo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @NoArgsConstructor @AllArgsConstructor public class UserVo { private Integer id; private String username; private String mobile; private String avatar; private String statusText; // 自定义 setter 用于脱敏 public void setMobile(String mobile) { this.mobile = maskMobile(mobile); } public void setStatus(Integer status) { this.statusText = convertStatusText(status); } // 静态工厂方法 public static UserVo fromEntity(com.itheima.miniblog.entity.User user) { return UserVo.builder() .id(user.getId()) .username(user.getUsername()) .mobile(maskMobile(user.getMobile())) .avatar(user.getAvatar()) .statusText(convertStatusText(user.getStatus())) .build(); } private static String maskMobile(String mobile) { if (mobile == null || mobile.length() != 11) { return mobile; } return mobile.substring(0, 3) + "****" + mobile.substring(7); } private static String convertStatusText(Integer status) { if (status == null) return "未知"; return switch (status) { case 0 -> "禁用"; case 1 -> "正常"; case 2 -> "锁定"; case 3 -> "待激活"; default -> "未知"; }; } }

3. 使用枚举优化状态管理

package com.itheima.miniblog.vo; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.Getter; @Data @Builder public class UserVo { private Integer id; private String username; private String mobile; private String avatar; private String statusText; // 状态枚举 @Getter @AllArgsConstructor public enum UserStatus { DISABLED(0, "禁用"), NORMAL(1, "正常"), LOCKED(2, "锁定"), PENDING(3, "待激活"); private final Integer code; private final String text; public static String getTextByCode(Integer code) { if (code == null) return "未知"; for (UserStatus status : values()) { if (status.getCode().equals(code)) { return status.getText(); } } return "未知"; } } // 转换方法 public static UserVo fromEntity(com.itheima.miniblog.entity.User user) { String maskedMobile = user.getMobile() != null && user.getMobile().length() == 11 ? user.getMobile().substring(0, 3) + "****" + user.getMobile().substring(7) : user.getMobile(); return UserVo.builder() .id(user.getId()) .username(user.getUsername()) .mobile(maskedMobile) .avatar(user.getAvatar()) .statusText(UserStatus.getTextByCode(user.getStatus())) .build(); } }

4. 使用方法示例

Service 层使用:

@Service public class UserService { public UserVo getUserById(Integer id) { User user = userRepository.findById(id).orElseThrow(); // 方式1:使用构造方法 // return new UserVo(user.getId(), user.getUsername(), // user.getMobile(), user.getAvatar(), user.getStatus()); // 方式2:使用静态工厂方法(推荐) return UserVo.fromEntity(user); } public List<UserVo> getAllUsers() { List<User> users = userRepository.findAll(); // 使用 Stream 转换 return users.stream() .map(UserVo::fromEntity) .collect(Collectors.toList()); } }

Controller 层使用:

@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public Result<UserVo> getUser(@PathVariable Integer id) { UserVo userVo = userService.getUserById(id); return Result.success(userVo); } @GetMapping public Result<List<UserVo>> getAllUsers() { List<UserVo> userVos = userService.getAllUsers(); return Result.success(userVos); } } // 统一返回结果类 @Data class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("成功"); result.setData(data); return result; } }

5. 使用 MapStruct 自动化转换(高级)

如果项目中有很多 VO 转换,建议使用 MapStruct:

// 1. 添加依赖 // Maven <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> // 2. 创建转换器接口 @Mapper(componentModel = "spring") public interface UserConverter { UserConverter INSTANCE = Mappers.getMapper(UserConverter.class); @Mapping(target = "mobile", expression = "java(maskMobile(user.getMobile()))") @Mapping(target = "statusText", expression = "java(convertStatusText(user.getStatus()))") UserVo toVo(User user); default String maskMobile(String mobile) { if (mobile == null || mobile.length() != 11) { return mobile; } return mobile.substring(0, 3) + "****" + mobile.substring(7); } default String convertStatusText(Integer status) { // 转换逻辑 return UserVo.UserStatus.getTextByCode(status); } } // 3. 在 Service 中使用 @Service public class UserService { @Autowired private UserConverter userConverter; public UserVo getUserById(Integer id) { User user = userRepository.findById(id).orElseThrow(); return userConverter.toVo(user); } }

总结建议

  1. 基础项目:使用第 2 种方式(Builder 模式 + 静态工厂方法)

  2. 复杂项目:使用第 4 种方式(MapStruct 自动化转换)

  3. 关键点

    • 确保敏感字段不暴露

    • 脱敏处理要完整

    • 状态转换要清晰

    • 提供方便的转换方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:23:00

算法竞赛从入门到跳楼(ACM-XCPC、蓝桥杯软件赛等)

算法竞赛从入门到跳楼&#xff08;ACM-XCPC、蓝桥杯软件赛等&#xff09; 第一周 12.8 12.9 12.10 12.11 12.12 12.13 12.14 主要是基础逻辑处理。 第二周 12.15 分支判断 12.16 年份问题 12.17 遍历思想 12.18 二进制 12.19 数位拆分 12.20 循环 12.21 质因数 第三周 12…

作者头像 李华
网站建设 2026/5/1 8:32:07

6、深入解析Apache服务器:从mod_perl到多守护进程配置

深入解析Apache服务器:从mod_perl到多守护进程配置 清理日志文件 在进行日志文件清理时,有一条命令可以清理所有日志文件。不过,在运行此命令之前,务必确保任何恢复所需的日志文件都已备份。 mod_perl简介 Perl是由Larry Wall编写的高级编程语言,它源自C语言,拥有众多…

作者头像 李华
网站建设 2026/5/1 9:48:35

14、Apache服务器安全与故障排除全解析

Apache服务器安全与故障排除全解析 1. MD5校验和与密码认证 目前,还没有人知道如何在不改变文件MD5校验和的情况下修改文件。研究人员仍在努力尝试破解MD5,并且取得了一定进展,但对于大多数应用来说,MD5仍然足够强大。 在密码认证方面,Apache可以通过mod_auth模块执行认…

作者头像 李华
网站建设 2026/5/1 8:19:19

碰一碰营销系统电脑端+手机端双端开发方案

双端功能互补&#xff1a;电脑端承担“系统配置数据复盘批量管理”重操作&#xff0c;手机端实现“轻量化运营实时监控现场调试”&#xff0c;覆盖商家从后台管理到前端落地全场景。数据实时同步&#xff1a;打通碰一碰营销系统双端数据库&#xff0c;确保NFC触发数据、内容分发…

作者头像 李华
网站建设 2026/5/1 7:24:54

基于STM32单片机快递柜储物柜扫码灯光消毒语音播报蓝牙无线APP/WiFi无线APP/摄像头视频监控/云平台设计S369

STM32-S369-存取柜光敏灯光消毒取件码二维码语音播报存件手机号录入后台数据4舵机OLED屏按键(无线方式选择)产品功能描述&#xff1a;本系统由STM32F103C8T6单片机核心板、OLED屏、&#xff08;无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选&#xff09;、键盘部分、语音…

作者头像 李华
网站建设 2026/5/1 6:20:16

FLUX.1-Controlnet-Union新手配置指南

FLUX.1-Controlnet-Union新手配置指南&#xff1a;零基础搭建下一代文生图生成系统 在AI图像生成技术飞速演进的今天&#xff0c;FLUX.1系列模型凭借其革命性的Flow Transformer架构和强大的多模态控制能力&#xff0c;正迅速成为创意工作者与开发者的新宠。然而&#xff0c;面…

作者头像 李华