微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java编写的实体返回VO工具

VO(value object)通常用于业务层之间的数据传递,VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。本文将介绍如何将实体转换为vo对象

好久不见 最近些许有点懒惰 程序员嘛 每个月总会有几天的 你懂得

那最近发现好的代码写出来真的会让人有种赏心悦目的存在 相反就会有一种想掐死写代码的那个人

所以我最近写了一个小工具 就是实体转换VO对象的一个小工具 说到这里 如果你的第一反应是 Spring的BeanUtils 那说明你肯定也有遇到过跟我一样的问题

那具体是怎么做? (不考虑性能的情况下) 等下分析

先看下如果正常返回VO我们需要怎么去操作?

现在有一个用户实体

import lombok.Data; /** * 用户实体 * * @author 是小张啊 * @since 2021-05-06 */ @Data public class User { /** * 用户id */ private String id; /** * 用户名称(账号) */ private String name; /** * 密码(不加密) */ private String password; }

现在需要返回一个VO的对象 即

import lombok.Data; /** * 用户vo对象 * @author 是小张啊 * @since 2021-05-06 */ @Data public class UserVo { /** * 用户id */ private String id; /** * 用户名称(账号) */ private String name; }

可以这样处理

import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author 是小张啊 * @since 2021-05-06 */ @RestController public class UserController { /** * 查询用户 * @return */ @GetMapping("/select") public UserVo select() { User user = new User(); user.setId(1); user.setName("是小张啊"); UserVo userVo = new UserVo(); BeanUtils.copyProperties(user, userVo); return userVo; } }

这样是没有问题的 不谈性能 这样做是非常稳的

现在有这样的一个需求 需要返回一个 List 如果你能想到用 java8的lambda表达式的去使用Spring的BeanUtils 那也是不错的

具体实现就是

import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * @author 是小张啊 * @since 2021-05-06 */ @RestController public class UserController { /** * 查询用户 * @return */ public List select() { // 初始化数据 User user1 = new User(); user1.setId(1); user1.setName("是小张啊"); User user2 = new User(); user2.setId(1); user2.setName("是小张啊"); List users = new ArrayList(); users.add(user1); users.add(user2); // List -> List List userVos = users.stream().map(user -> { UserVo userVo = new UserVo(); BeanUtils.copyProperties(user, userVo); return userVo; }).collect(Collectors.toList()); return userVos; } }

这其实也挺不错的 只是每次都这样写 属实不美观 如果能提取公共方法调用就太舒服了 所以这个方法也是根据 BeanUtils去优化这个工具

import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * Bean 工具类 * @author 是小张啊 * @since 2021-05-06 */ @Slf4j public class Utils extends BeanUtils { /** * 将实体批量转换成 vo对象 * 注:当前只针对 List * * @param source 实体集合 * @param clazz 需要批量转换成的对象 * @param * @param * @return */ @SneakyThrows public static List conversionVo(List source, Class clazz) { return source.stream().map(resources -> { T t = null; try { // 利用反射 创建一个新的实例 t = clazz.newInstance(); BeanUtils.copyProperties(resources, t); } catch (InstantiationException e) { log.info("{}实例化失败", clazz); } catch (illegalaccessexception e) { log.info("{}不可访问", clazz); } return t; }).collect(Collectors.toList()); } }

这样就很方便 只需要去调用即可

import top.lzmvlog.common.Utils; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; /** * @author 是小张啊 * @since 2021-05-06 */ @RestController public class UserController { /** * 查询用户 * @return */ public List select() { // 初始化数据 User user1 = new User(); user1.setId(1); user1.setName("是小张啊"); User user2 = new User(); user2.setId(1); user2.setName("是小张啊"); List users = new ArrayList(); users.add(user1); users.add(user2); List userVos = Utils.conversionVo(users, UserVo.class); return userVos; } }

BeanUtils 是有局限性的 你必须保证 实体的字段值和返回的VO字段值是一样的

代码写到最后 其实就是一个不断优化的过程 领导来了 不能多说 得继续搬砖去了

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐