当前位置: 首页 > 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…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...