zoukankan      html  css  js  c++  java
  • 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;
    解决结果:成功
  • 相关阅读:
    20145124陈威名《java程序设计》 寒假学习总结
    20145124 《Java程序设计》第1 周学习总结
    20145124陈威名《java程序设计》 第二周学习总结·
    20145124陈威名 《Java程序设计》第3周学习总结
    20145124《Java程序设计》第5周学习总结
    C/C++拾遗(三)
    c#或js url传参中文乱码解决方案
    Java设计模式之代理模式
    关于Docker&kubernetes的一些问题
    前端存储之indexedDB
  • 原文地址:https://www.cnblogs.com/axibug/p/15172965.html
Copyright © 2011-2022 走看看