前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实体返回vo工具

实体返回vo工具

原创
作者头像
是小张啊喂
修改2021-05-07 10:21:00
4740
修改2021-05-07 10:21:00
举报
文章被收录于专栏:软件软件

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

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

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

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

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

现在有一个用户实体

代码语言:java
复制
import lombok.Data;

/**
 * 用户实体
 *
 * @author 是小张啊
 * @since 2021-05-06
 */
@Data
public class User {
    /**
     * 用户id
     */
    private String id;

    /**
     * 用户名称(账号)
     */
    private String name;

    /**
     * 密码(不加密)
     */
    private String password;
}

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

代码语言:javascript
复制
import lombok.Data;

/**
 * 用户vo对象
 * @author 是小张啊
 * @since 2021-05-06
 */
@Data
public class UserVo {
    /**
     * 用户id
     */
    private String id;

    /**
     * 用户名称(账号)
     */
    private String name;
}

可以这样处理

代码语言:javascript
复制
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<UserVo> 如果你能想到用 java8lambda表达式的去使用SpringBeanUtils 那也是不错的 具体实现就是

代码语言:javascript
复制
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<UserVo> select() {
        // 初始化数据
        User user1 = new User();
        user1.setId(1);
        user1.setName("是小张啊");
        User user2 = new User();
        user2.setId(1);
        user2.setName("是小张啊");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);

        // List<entity> -> List<vo>
        List<UserVo> userVos = users.stream().map(user -> {
            UserVo userVo = new UserVo();
            BeanUtils.copyProperties(user, userVo);
            return userVo;
        }).collect(Collectors.toList());
        return userVos;
    }

}

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

代码语言:javascript
复制
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 <T>
     * @param <S>
     * @return
     */
    @SneakyThrows
    public static <T, S> List<T> conversionVo(List<S> source, Class<T> 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());
    }
}

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

代码语言:javascript
复制
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<UserVo> select() {
        // 初始化数据
        User user1 = new User();
        user1.setId(1);
        user1.setName("是小张啊");
        User user2 = new User();
        user2.setId(1);
        user2.setName("是小张啊");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        List<UserVo> userVos = Utils.conversionVo(users, UserVo.class);
        return userVos;
    }

}

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

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

喜欢编程的,请关注我的博客https://www.lzmvlog.top/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档