VO数据封装失败原因及解决方案

业务详情:小视频业务。接受数据涉及 video表 (存于mongoDB); userInfo表(存于MySQL)

前端接收数据:一个pagebean,一个小视频VO (封装video表全部数据和userInfo表部分数据)

问题详情:小视频VO数据封装全部失败,或部分失败

问题分析:

  1 首先 属性名一定要一致  如下代码中:videoVo中的存在的属性,userInfo中一定要有,属性要名字相同,才能被赋值,否则需手动赋值

  2 关注数据类型转换问题  如下代码中: 因为video表存于MongoDB,其id为object类型 封装到videoVo中需要转为string类型  

数据封装详细代码:

    //查询小视频 使用@Cacheable返回值必须实现序列化
    @Cacheable(value = "video")//redis数据缓存 默认从redis里取,没有数据会查询数据库
    public PageBeanVo smallVideos(Integer page, Integer pagesize) {

        log.debug("正在执行VideoService smallVideos方法");

        // 分页查询video数据--mongo
        PageBeanVo pageBean = videoApi.findVideo(page, pagesize);

        // 查询userInfo数据
        List<Video> items = (List<Video>) pageBean.getItems();
        List<VideoVo> videoVoList = new ArrayList<>();

        if (CollectionUtil.isNotEmpty(items)) {
            for (Video video : items) {
                UserInfo userInfo = userInfoApi.findUserInfo(video.getUserId());

                // 封装app需要vo
                VideoVo videoVo = new VideoVo();
                //封装userInfo属性到videoVo
                //copyProperties(userInfo,videoVo)videoVo中的存在的属性,userInfo中一定要有,属性要名字相同,才能被赋值,否则需手动赋值
                BeanUtils.copyProperties(userInfo, videoVo);
                //手动封装userInfo的id
                videoVo.setUserId(userInfo.getId());

                //封装video属性到videoVo
                BeanUtils.copyProperties(video, videoVo);//copyProperties(video,videoVo)videoVo中的存在的属性,video中一定要有
                //手动封装视频id
                videoVo.setId(video.getId().toString());//object转string
                //videoVo.setId(video.getVid().toString());
                //手动封装视频封面
                videoVo.setCover(video.getPicUrl());
                //手动封装视频说明
                videoVo.setSignature(video.getText());
                //设置是否点赞 默认不点赞
                videoVo.setHasLiked(0);

                if (stringRedisTemplate.hasKey(StrUtil.format("follow_user_{}_{}", UserHolder.getUser().getId(), video.getUserId()))) {
                    videoVo.setHasFocus(1); //是否关注
                } else {
                    videoVo.setHasFocus(0); //是否关注
                }
                videoVo.setHasLiked(0); //是否点赞
                videoVoList.add(videoVo);
            }
        }

        log.debug("videoVoList: "+videoVoList);

        // 返回pageBean
        pageBean.setItems(videoVoList);
        return pageBean;

解决方案1:属性名不一致,单独封装属性

解决结果:失败

解决方案2:数据类型不一致,转换数据类型封装

解决结果:失败

解决方案3: 检查导入的BeanUtils工具类包是否正确:

import org.apache.commons.beanutils.BeanUtils;

导入:
import org.springframework.beans.BeanUtils;
解决结果:成功
posted @ 2021-08-22 17:47  java从精通到入门  阅读(249)  评论(0编辑  收藏  举报