当前位置: 首页 > news >正文

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

目录

  • 项目场景:三类分类部分不显示
  • 问题描述:数据库序号128后的目录不显示
  • 原因分析: 数据库&JAVA后端
    • 代码:
      • 后端接口
  • 解决方案:
    • 1 数据库序号问题
    • 2 JAVA层面
      • 1 递归改成非递归写法
      • 2重新写接口: 查询cat_id为128的子目录
  • 解决方法:加上(long)向下转型自动拆箱
  • 总结: 递归使用要慎重,自动装箱的隐藏机制需要熟悉

项目场景:三类分类部分不显示

实现ElementUI中三级分类的功能,发现没有前端三级目录的二级目录可以新建三级目录,数据库中也有数据,但是无法在前端显示!后端的接口没有返回数据库的数据。
在这里插入图片描述


问题描述:数据库序号128后的目录不显示

提示:这里描述项目中遇到的问题:

例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:

@Overridepublic void run() {bytes = mmInStream.read(buffer);mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();}

原因分析: 数据库&JAVA后端

提示:例如:在骑行运动耳机目录之后新建的目录,前端界面显示新建成功,数据库也有数据,但是不会显示在前端。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据库中新建数据成功,但是在骑行运动中不会显示出这个新建的婴儿车三级目录。
在这里插入图片描述
IDEA 日志打印记录显示插入成功
在这里插入图片描述
使用sql查询 parent_cid为128的二级目录
在这里插入图片描述

再使用接口测试前端界面没有婴儿车
在这里插入图片描述

代码:

后端接口

//controller层/*** 查出所有分类以及子分类,以树形结构组装起来*/@RequestMapping("/list/tree")public R list(){List<CategoryEntity> entities = categoryService.listWithTree();return R.ok().put("data", entities);}//接口Service层List<CategoryEntity> listWithTree();

Service的具体实现

    @Overridepublic List<CategoryEntity> listWithTree() {//1、查出所有分类List<CategoryEntity> entities = baseMapper.selectList(null);//2、 组装成父子的树形结构//2.1) 找到所有一级分类(父分类id为0)List<CategoryEntity> level1Menus = entities.stream().filter(categoryEntity ->categoryEntity.getCatLevel() == 1).map((menu)->{
//            System.out.println(menu);menu.setChildren(getChildrens(menu,entities));
//            menu.setChildren(getSubtreeById(menu.getCatId(), entities));return menu;}).sorted((menu1,menu2)->{return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());return level1Menus;}//递归查找所有菜单的子菜单private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){//1.找到当前菜单的子菜单(每个子菜单还有子菜单)
//        Stream<CategoryEntity> categoryEntityStream = all.stream().filter(entity -> (long)entity.getParentCid() == (long)root.getCatId()); //出bug语句Stream<CategoryEntity> categoryEntityStream = all.stream().filter(entity -> entity.getParentCid() == root.getCatId());Stream<CategoryEntity> mapEntityStream = categoryEntityStream.map(item -> {item.setChildren(getChildrens(item,all));return item;});List<CategoryEntity> children = mapEntityStream.sorted((menu1,menu2)->{return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());return  children;

解决方案:

提示:CatID为128以后的二级目录都不显示数据库中有的三级目录

1 数据库序号问题

DROP TABLE IF EXISTS `pms_category`;CREATE TABLE `pms_category` (`cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',`name` char(50) DEFAULT NULL COMMENT '分类名称',`parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id',`cat_level` int(11) DEFAULT NULL COMMENT '层级',`show_status` tinyint(4) DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',`sort` int(11) DEFAULT NULL COMMENT '排序',`icon` char(255) DEFAULT NULL COMMENT '图标地址',`product_unit` char(50) DEFAULT NULL COMMENT '计量单位',`product_count` int(11) DEFAULT NULL COMMENT '商品数量',PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1424 DEFAULT CHARSET=utf8mb4 COMMENT='商品三级分类';

AUTO_INCREMENT=1424 原来的数据库是1434,改成了1424让cat_id自增 序号不断层,问题还是解决。 开始以为是数据库很多序号乱码,后面才发现是128二级目录开始出问题。

2 JAVA层面

1 递归改成非递归写法

        //原版代码
//        List<CategoryEntity> children = all.stream().filter(categoryEntity -> {
//            return categoryEntity.getParentCid() == root.getCatId();
//        }).map(categoryEntity->{
//            //2.利用映射递归查找 子菜单的子菜单
//            categoryEntity.setChildren(getChildrens(categoryEntity,all));
//            return categoryEntity;
//        }).sorted((menu1,menu2)->{
//            //3.对当前菜单进行排序,升序排序
//            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
//        }).collect(Collectors.toList());
//
//        return children;//非递归写法
//        List<CategoryEntity> result = new ArrayList<>();
//        for (int i = 0; i < all.size(); i++){
//            CategoryEntity entity = all.get(i);
//            if (entity.getParentCid() == root.getCatId()) {
//                result.add(entity);
//            }
//        }
//        System.out.println(result);
//
//        for (int i = 0; i < result.size(); i++){
//            CategoryEntity current = result.get(i);
//            List<CategoryEntity> sub = new ArrayList<>();
//            for (int j = 0; j < all.size(); j++){
//                CategoryEntity entity = all.get(j);
//                if (entity.getParentCid() == current.getCatId()) {
//                    List<CategoryEntity> subsub = new ArrayList<>();
//                    for (int k = 0; k < all.size(); k++){
//                        CategoryEntity subEntity = all.get(k);
//                        if (subEntity.getParentCid() == entity.getCatId()){
//                            subsub.add(subEntity);
//                        }
//                    }
//                    entity.setChildren(subsub);
//                    sub.add(entity);
//                }
//            }
//            current.setChildren(sub);
//        }
//
//        return result;

还是不行

2重新写接口: 查询cat_id为128的子目录

//Controller层/*** 信息*/@RequestMapping("/info/{catId}")//@RequiresPermissions("product:category:info")public R info(@PathVariable("catId") Long catId) {CategoryEntity category = categoryService.getById(catId);return R.ok().put("data", category);}//Service层List<CategoryEntity> getSubtreeById(long catId);

接口实现功能

    @Overridepublic List<CategoryEntity> getSubtreeById(long catId) {List<CategoryEntity> entities = baseMapper.selectList(null);List<CategoryEntity> filterList = entities.stream().filter(item -> item.getParentCid() == catId).map(item -> {item.setChildren(getSubtreeById(item.getCatId()));return item;}).collect(Collectors.toList());return filterList;}

前端端口测试: 直接通过id的方式能够查询到父ID为128的所有目录,既婴儿车的父目录找到了。
在这里插入图片描述
后续按照这个思路重新写程序能够实现三级分类展现所有子目录的功能,但是对bug产生的原因不太清晰!!!

解决方法:加上(long)向下转型自动拆箱

改变一行代码
在这里插入图片描述
就是因为递归调用了太多次,自动装箱成Long对象,但是Long对象装箱的源码实现跟128有很大的关系!! 下面解释中的Integer是一个道理,(Integer) 128 == (Integer) 128 为false,所以128之后的二级目录都不满足这个判断,所以他们的三级目录无法加载!!!
具体代码实现可以看引用!!!

Integer类 -128~127 之间的值都是直接从缓存中取出的,(Integer)127 == (Integer)127两边装箱后,实际指向堆内存中同一个对象,大于127 后就new一个新的对象返回。(Integer)128 == (Integer)128,装箱为引用类型后,没有做缓存,指向堆内存中不同对象,所以比较结果为false。至于为什么要缓存,若不缓存,每次都要new一个新对象,资源消耗多,所以缓存一些常用的数,来减少资源损耗。
————————————————
版权声明:本文为CSDN博主「有时候我也会」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43849277/article/details/108275997

总结: 递归使用要慎重,自动装箱的隐藏机制需要熟悉

开发过程中不要随便用递归!!!Debug不好调整,遇到其他问题结合,真的是头皮发麻!!!本文只是精简的讲述了核心找bug的过程,但是Debug打各种条件断点,查看Tomcat源码,StackFlow看英文,,,等等困扰了我一天的bug,终于跟冠哥合理解决了!!!

推荐看一下阿里开发手册对递归使用的建议!!!

相关文章:

三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

目录 项目场景&#xff1a;三类分类部分不显示问题描述&#xff1a;数据库序号128后的目录不显示原因分析&#xff1a; 数据库&JAVA后端代码&#xff1a;后端接口 解决方案&#xff1a;1 数据库序号问题2 JAVA层面1 递归改成非递归写法2重新写接口&#xff1a; 查询cat_id为…...

Leetcode1839. 所有元音按顺序排布的最长子字符串

Every day a Leetcode 题目来源&#xff1a;1839. 所有元音按顺序排布的最长子字符串 解法1&#xff1a;滑动窗口 要找的是最长美丽子字符串的长度&#xff0c;我们可以用滑动窗口解决。 设窗口内的子字符串为 window&#xff0c;每当 word[right] > window.back() 时&…...

C/C++程序设计和预处理

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…...

openssl生成自签名证书

原网址&#xff1a;https://blog.csdn.net/weixin_41767181/article/details/121531007 windows下安装openssl后&#xff0c;生成自签名证书并打包为P12文件的命令如下&#xff1a; 需要注意的是&#xff1a; 每一级的证书中&#xff0c;证书的公司名称等尽量不要一样根证书…...

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)

基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表&#xff1a; 1、 数据管理&#xff1a;物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…...

深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识

文章目录 &#x1f31f; 技术架构&#xff1a;深度学习推荐系统的经典技术架构长啥样&#xff1f;&#x1f34a; 一、深度学习推荐系统的技术架构&#x1f34a; 二、基于用户行为的推荐&#x1f34a; 三、基于多模态数据的推荐&#x1f34a; 四、基于知识图谱的推荐 &#x1f3…...

ios UI 基础开发二

第一节&#xff1a;UIPickerView、UIPickerViewDataSource、UIPickerViewDelegate 设置约束&#xff0c;如果要设置两个兄弟的约束&#xff0c;可以按住option键&#xff0c;用鼠标右键把a拖到b上面&#xff0c;表示a按照b来对齐 生成随机数 如果后面列的数据&#xff0c;依赖前…...

失配树学习笔记

失配树&#xff0c;是一种奇妙的数据结构&#xff0c;它利用 KMP、LCA 解决求两前缀的最长公共 Border 的问题。 首先介绍一下什么是 Border&#xff0c;我们知道 nxt 数组是前后缀相同的最大长度&#xff0c;Border 相当于是 nxt 数组的弱化版&#xff0c;只是去掉了“最大”…...

【Electron】Not allowed to load local resource

问题描述 使用 audio 标签播放音频文件&#xff0c;控制台报错 Not allowed to load local resource。 Not allowed to load local resource原因分析 通常是安全策略所引起的。Electron 默认情况下禁止加载本地资源&#xff0c;以防止潜在的安全风险。 解决方案 在 main.js…...

Maven 基础教程系列

Maven是一个项目开发管理和理解工具。基于项目对象模型的概念&#xff1a;构建、依赖关系管理、文档创建、站点发布和分发发布都由pom.xml声明性文件控制。Maven可以通过插件进行扩展&#xff0c;以使用许多其他开发工具来报告或构建过程。 一、Maven 使用教程-CSDN博客 二、…...

c++之类和对象

1.auto 可以自动推导结果的类型 typeid()可以打印类型 引用也可以 auto真正的价值可以简化迭代器的写法 并且auto定义的变量必须初始化。 不能做参数 返回值也不可以用auto auto不能用来声明数组 如果想要修改要用引用且指针不好解决。 c11之后的nullptr 以后再用空指针用nul…...

分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计

本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 本文的内容主要围绕以下几个部分&#xff1a; TCP/IP的简单介绍。消息的介绍。基于消息分类的传输格式&…...

医疗领域的数字化浪潮:互联网医院平台的关键作用

数字化浪潮正在迅速改变医疗领域的方式和效率。互联网医院平台作为数字化医疗的关键元素&#xff0c;正在为医疗行业带来巨大的变革。本文将探讨互联网医院平台的关键作用&#xff0c;并提供一个示例&#xff0c;使用Python编写一个简单的医疗预约系统。 互联网医院平台的关键…...

将本地的项目上传到Gitee

目录 1.先在Gitee新建一个仓库,提交即可 2.进入到要上传的项目里面&#xff0c;右键选择 Git Bash Here 3.右键后就打开了Git命令窗口 4.配置你的用户名和邮箱(已经配置过则可跳过) 5.查看你的用户名和邮箱配置&#xff08;可不查看&#xff09; 6.输入git init指令&#…...

概率论_概率公式中的分号(;)、逗号(,)、竖线(|)

1. 概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类东西&#xff0c;以概率P(x;θ)为例&#xff0c;分号前面是x样本&#xff0c;分号后边是模型参数。 , 逗号代表两者地位平等&#xff0c;代表与的关系 | 竖线代表 if&#xff0c;一上面为例&#xff0c;就是如果…...

Spark Streaming 整合 Kafka

本文代码链接:https://download.csdn.net/download/shangjg03/88442308 1.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:`spark-streaming-kafka-0-8` 和 `spark-streaming-kafka-0-10`,其主要区别如下: 本文使用的 Kafka 版本为 `kafka_2.12-2.2.0`,故采用…...

【API篇】五、Flink分流合流API

文章目录 1、filter算子实现分流2、分流&#xff1a;使用侧输出流3、合流&#xff1a;union4、合流&#xff1a;connect5、connect案例 分流&#xff0c;很形象的一个词&#xff0c;就像一条大河&#xff0c;遇到岸边有分叉的&#xff0c;而形成了主流和测流。对于数据流也一样…...

flutter开发的一个小小小问题,内网依赖下不来

问题 由于众所周知的原因&#xff0c;flutter编译时&#xff0c;经常出现Could not get resource https://storage.googleapis.com/download.flutter.io…的问题&#xff0c;如下&#xff1a; * What went wrong: Could not determine the dependencies of task :app:lintVit…...

RabbitMQ队列及交换机的使用

目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖 3、生产者配置文件 4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消…...

分布式唯一Id,它比GUID好

分布式唯一Id&#xff0c;它比GUID好 一、前言 分布式唯一Id&#xff0c;顾名思义&#xff0c;是指在全世界任何一台计算机上都不会重复的唯一Id。 在单机/单服务器/单数据库的小型应用中&#xff0c;不需要用到这类东西。但在高并发、海量数据、大型分布式应用中&#xff0c…...

Text-to-SQL四重翻车实录:不懂SQL也能开口即得数据?

【2026爆发元年】Text-to-SQL四重翻车实录&#xff1a;不懂SQL也能开口即得数据&#xff1f; 文章目录 【2026爆发元年】Text-to-SQL四重翻车实录&#xff1a;不懂SQL也能开口即得数据&#xff1f;一、痛点场景描述&#xff1a;四个翻车现场&#xff0c;你中了几条&#xff1f;…...

iFakeLocation:跨平台iOS虚拟定位终极指南,无需越狱轻松修改设备位置

iFakeLocation&#xff1a;跨平台iOS虚拟定位终极指南&#xff0c;无需越狱轻松修改设备位置 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation 在数字时代&a…...

内核可换,生态为王:一文读懂操作系统的三层架构与隐藏的“护城河”

你有没有想过这样一个问题&#xff1a;我们每天都在和操作系统打交道——Windows、macOS、Linux、Android、iOS&#xff0c;这些名字耳熟能详。但如果我问你&#xff0c;“操作系统”到底由什么组成&#xff0c;什么是内核&#xff0c;什么是中间层&#xff0c;什么又是应用程序…...

靠谱的安卓安全加固公司怎么选?从价格、案例到合同避坑的完整指南

当你准备为公司核心的App采购安全加固服务时&#xff0c;意味着你已经进入了“货比三家”的决策阶段。你不再满足于看宣传册&#xff0c;而是开始关心&#xff1a;这家公司报价多少&#xff1f;案例是否真实&#xff1f;合同里有没有隐藏条款&#xff1f;售后响应速度究竟如何&…...

3步搭建你的AI化学助手:ChemCrow让复杂化学问题变简单

3步搭建你的AI化学助手&#xff1a;ChemCrow让复杂化学问题变简单 【免费下载链接】chemcrow-public Chemcrow 项目地址: https://gitcode.com/gh_mirrors/ch/chemcrow-public 还在为复杂的化学计算和分子分析烦恼吗&#xff1f;ChemCrow AI化学助手来了&#xff01;这是…...

PoeCharm架构解析:基于数据本地化的流放之路角色构建系统优化

PoeCharm架构解析&#xff1a;基于数据本地化的流放之路角色构建系统优化 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm Path of Building&#xff08;PoB&#xff09;作为流放之路&#xff08;Pa…...

如何快速部署GLM-5-w4a8:Atlas 800T A3上的终极AI推理解决方案

如何快速部署GLM-5-w4a8&#xff1a;Atlas 800T A3上的终极AI推理解决方案 【免费下载链接】GLM-5-w4a8 GLM-5-w4a8基于混合专家架构&#xff0c;专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署&#xff0c;适配Atlas 800T A3&#xff0c;采用w4a8量化技术&#x…...

瑞芯微(EASY EAI)RV1126B 应用依赖库安装

1. 文件系统依赖库安装 1.1 前言 用户在进行Linux开发的过程中&#xff0c;经常会遇到找不到命令&#xff0c;或者找不到依赖库的问题&#xff0c;这是系统没有预装导致的。 1.2 安装前准备 进入板卡环境&#xff0c;通过命令对板卡进行操作。具体方法可查看《入门指南/调试…...

别再手动重启了!IIS 7.5网站总挂?一招设置让应用程序池永不停止(附模块安装避坑)

IIS 7.5应用程序池自动恢复实战&#xff1a;告别半夜救火的运维噩梦 凌晨三点&#xff0c;服务器监控突然告警——网站又挂了。你强撑睡眼连上服务器&#xff0c;发现IIS应用程序池不知何时已经停止。这已经是本月第七次了。对于中小企业的运维人员或个人站长来说&#xff0c;这…...

避坑指南:爬取88tingshu.com等听书网站音频时,你可能会遇到的3个反爬点及解决方案

听书网站音频爬取实战&#xff1a;破解三大反爬机制的深度指南 引言&#xff1a;当常规爬虫遇上听书网站 最近帮朋友抓取某听书网站的有声小说时&#xff0c;发现事情并不简单。本以为像普通网页一样直接解析HTML就能获取音频链接&#xff0c;结果遭遇了各种"花式拦截&q…...