Java编写的实体返回VO工具

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

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

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

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

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

现在有一个用户实体

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

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

import lombok.Data;/** * 用户vo对象 * @author 是小张啊 * @since 2021-05-06 */@Datapublic 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 */@RestControllerpublic 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> 如果你能想到用 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 */@RestControllerpublic 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去优化这个工具

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 */@Slf4jpublic 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());    }}

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

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 */@RestControllerpublic 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字段值是一样的

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

以上就是Java编写的实体返回VO工具的详细内容,更多关于Java 实体返回VO工具的资料请关注其它相关文章!

我要准备好行李启程了,谢谢关心我的家人和朋友,

Java编写的实体返回VO工具

相关文章:

你感兴趣的文章:

标签云: