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;
    解决结果:成功
  • 相关阅读:
    jQuery EasyUI实现全部关闭tabs
    设计与实现模块管理系统基本功能定义自己(28--所述多个模块之间的关联[4])
    C++11的一些功能
    表和视图之间的区别
    三个思路来实现自己定义404页面
    WebGL 在 OpenGL ES 指令 iOS 在 C 分歧版指令分析
    hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
    新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路
    this compilation unit is not on the build path of a java project
    Ecshop wap
  • 原文地址:https://www.cnblogs.com/axibug/p/15172965.html
Copyright © 2011-2022 走看看