业务详情:小视频业务。接受数据涉及 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;
解决结果:成功
总结:包导错什么的也太烦人了,一个alt+enter不注意,就要debug半天,还找不到错,我吐了~