【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
一、报错内容
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
### The error may exist in com/xxx/cloud/mall/admin/mapper/GoodsCategoryMapper.java (best guess)
### The error may involve com.xxx.cloud.mall.admin.mapper.GoodsCategoryMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO goods_category (id, enable, parent_id, name, description, sort, create_time, del_flag, tenant_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)
### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
; Column 'tenant_id' cannot be null; nested exception is java.sql.SQLIntegrityConstraintViolationException: Column 'tenant_id' cannot be null
二、报错说明
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘tenant_id’ cannot be null;
报错很明显,就是因为在插入数据表 记录时候,租户字段空了,所以导致了插入失败报错。
INSERT INTO goods_category (id,ENABLE,parent_id,NAMEdescription,sort,create_time,del_flag,tenant_id
)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, NULL)
2.1 为什么本地测试是成功的?
那?为什么本地测试是成功的?发沙箱了就不行了?
因为本机直接跳过了租户的判断,直接到从Gateway转到了Mall-admin
但是沙箱就不行,必需要加上租户字段,才能发起请求。
2.2 能不加租户字段吗?
查看nacos中的配置,发现,我们定义了租户表维护,
其中,刚好操作的这张表(goods_category)是一定要加租户信息的,不然就会报错
base:# 租户表维护tenant:column: tenant_idtables:- goods_category
三、报错解决
3.1 【错误尝试】是不是请求Header要加租户字段?
因为是mall-admin,是有页面的,直接发起页面请求之后,Chrome浏览器,点击键盘F12,呼出Chrome的控制台,可以获取到Header中的Token字段(Authorization)+租户字段(switch-tenant-id)

因此,可以直接拷贝到ApiFox中,再次进行接口调用,我还以为解决了,结果问题依旧!

继续排查!
3.2 【正确解决】是不是持久化时,要加tenant_id字段?
认真看一下报错,问题处在GoodsCategoryMapper上,那就在代码前后,往上追溯代码逻辑
The error may exist in com/xxx/cloud/mall/admin/mapper/GoodsCategoryMapper.java
private final JDConfigProperties jDConfigProperties;@Override
public void saveGoodsCategoryShop(GoodsCategoryImportDTO goodsCategoryImportDTO) {JSONArray goodsCategoryJsonArray = getJSONArray(goodsCategoryImportDTO);for (int i = 0; i < goodsCategoryJsonArray.size(); i++) {// 设置租户IDTenantContextHolder.setTenantId(jDConfigProperties.getTenantId());List<GoodsCategoryShop> goodsCategoryShopList = baseMapper.selectList(Wrappers.<GoodsCategoryShop>lambdaQuery().eq(GoodsCategoryShop::getId, JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id")));//重复类目数据的过滤if (ObjectUtil.isNotEmpty(goodsCategoryShopList)) {log.info("重复店铺类目数据:levelOneCategoryId = [{}],导入失败,店铺类目数据记录已经存在", goodsCategoryImportDTO.getLevelOneCategoryId());continue;}GoodsCategoryShop goodsCategoryShop = new GoodsCategoryShop();goodsCategoryShop.setId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id"));goodsCategoryShop.setName(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("name"));goodsCategoryShop.setParentId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("parentId"));int sortSize = getSort(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setSort(sortSize);addSize(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setShopId(jDConfigProperties.getShopId());goodsCategoryShop.setTenantId(jDConfigProperties.getTenantId());goodsCategoryShop.setEnable(CommonConstants.YES);goodsCategoryShop.setCreateTime(LocalDateTime.now());goodsCategoryShop.setDelFlag(DelFlagEnum.SHOW.getValue());goodsCategoryShop.setDescription(ProductChannelEnum.JINGDONG.getDesc());baseMapper.insert(goodsCategoryShop);}
}
看到下面这一句,其实有给租户字段赋值的,那为啥还会null呢?
goodsCategoryShop.setTenantId(jDConfigProperties.getTenantId());
那就肯定是jDConfigProperties.getTenantId()有问题了
好吧,直接说结论,Nacos中,没有配置相应的租户字段呗,
加上租户字段后, 问题解决!
四、参考文章
【项目实战】商城中基于MybatisPlus多租户功能逻辑设计
【异常】因为忘加了租户查询条件,导致重复ID导入失败Duplicate entry ‘XXX‘ for key ‘PRIMARY‘
【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
相关文章:
【异常】因多租户字段缺少导致Error updating database. Column ‘tenant_id‘ cannot be null
一、报错内容 org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column tenant_id cannot be null ### The error may exist in com/xxx/cloud/mall/admin/mapper/Goods…...
类和对象(上)
文章目录 面向对象的初步认知类的实例化this引用对象的构造及初始化封装static成员代码块内部类 对象的打印一、面向对象的初步认知 Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。在java中…...
Java经典面试题——谈谈 Java 反射机制,动态代理是基于什么原理?
典型回答 反射机制是 Java 语言提供的一种基本功能,赋予程序在运行时 自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法ÿ…...
19 客户端服务订阅机制的核心流程
Nacos客户端服务订阅机制的核心流程 说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起 Nacos订阅概述 Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通…...
教师论文|科技专著管理系统
技术:Java、JSP等摘要:随着计算机和互联网技术的发展,社会的信息化程度越来越高,各行各业只有适应这种发展趋势,才能增强自己的适应能力和竞争能力,不断发展壮大。大学作为教育的基地,是社会进步…...
骨传导耳机是什么意思,骨传导耳机的好处具体有哪些
在这个全民都是手机的时代,各种蓝牙耳机,入耳式耳机,真无线耳机等各种款式琳琅满目。而骨传导耳机是一种全新的科技产物,顾名思义就是通过头骨振动将声音传至外耳内的耳机。由于无需入耳,不会对耳朵造成任何影响。那…...
elasticsearch—使用汇总
文档结构1、概念简介2、使用创景3、核心组件4、环境部署5、操作实践官方网站:https://www.elastic.co/cn/elasticsearch/ 官方手册:https://www.elastic.co/guide/en/elasticsearch/reference/8.6/getting-started.html 参考教程: Aÿ…...
聊一聊代码重构——我们为什么要代码重构
代码重构 事情的起因是在去年下半年,我们终于无法承受往年的历史包袱而决定开始进行代码重构。 在以前我们尝试过进行代码重构但是从来没有系统性的考虑过如何重构。在对代码重构的过程中很多经验都是来自《重构:改善既有代码的设计》这本书,…...
【Python学习笔记】第二十九节 Python2 和Python3发生了哪些变化
Python 版本分为两大流派,一个是 Python 2.x 版本,另外一个是 Python 3.x 版本,Python 官方同时提供了对这两个版本的支持和维护。2020 年 1 月 1 日,Python 官方终止了对 Python 2.7 版本(最后一个 Python 2.x 版本&a…...
[oeasy]python0099_雅达利大崩溃_IBM的开放架构_兼容机_oem
雅达利大崩溃 回忆上次内容 个人计算机浪潮已经来临 苹果公司迅速发展微软公司脱离mits准备做纯软件公司IBM用大型机思路制作的5100惨败 Commodore 64 既做计算机又做游戏机 计算机行业和游戏行业 跟随着底层技术不断迭代已经进入了战乱纷纷的年代最终又会如何呢?…...
学术论文投稿之同行评审过程中可能会遭遇哪些偏见?
同行评审过程的顺利进行,在很大程度上取决于学术界的积极参与和相互信任,以及需要参与各方都以负责任的态度行事。作为审稿专家,向作者提供公正、客观的评价是至关重要的。同行评审过程中,若有任何偏离客观性的行为,均…...
Python写一个自动发送直播弹幕的工具,非常简单
哈喽大家好,今天给大家用Python整一个可以在直播间自动发弹幕的工具,来为喜欢的主播疯狂扣6 ! 事情原由昨晚回家,表弟在看LOL直播,看得我气不打一处来,差点就想锤他。 身为程序员的表弟,看直…...
学生档案管理系统的设计与实现
技术:Java、JSP等摘要:本设计是为托普学院学生档案的管理实现电子化而设计的,系统开发采用J2EE技术,数据库采用了SQL Server 2005,因而系统具有很好的扩展性、可移植性,实现了教学资源的信息化管理。主要功…...
JavaEE学习笔记-SpringBoot快速上手、部分注解解释
SpringBoot快速上手 一、快速创建SpringBoot应用1.1利用IDEA提供的Spring Initializr创建Spring Boot应用1.2Spring Boot生成的项目结构介绍1.3初步测试后端是否OK(建立一个controll类)二、热部署2.1 添加依赖2.2 Setting处项目自动化设置2.3 具体项目设置2.4 待选步骤三、注…...
【Python学习笔记】第二十六节 Python PyMySQL
一、什么是 PyMySQL?PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。可以用它来连接Python和MySQL。如果你追求速度,这是一个很好的选择,因为它比mysql-connector-python快。PyMySQL 遵循 Python 数据库 API v2.0 规范&#x…...
Android问题笔记 -关于Kotlin插件版本的问题
专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断…...
【同步工具类:Phaser】
同步工具类:Phaser介绍特性动态调整线程个数层次Phaser源码分析state 变量解析构造函数对state变量赋值阻塞方法arrive()awaitAdvance()业务场景实现CountDownLatch功能代码测试结果实现 CyclicBarrier功能代码展示测试结果总结介绍 一个可重复使用的同步屏障,功能…...
Linux命令·rmdir
今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具…...
从0开始自制解释器——综述
作为一个程序员,自制自己的编译器一直是一个梦想。之前也曾为了这个梦想学习过类似龙书、虎书这种大部头的书,但是光看理论总有一些云里雾里的感觉。看完只觉得脑袋昏昏沉沉并没有觉得有多少长进。当初看过《疯狂的程序员》这本书,书里说&…...
【spring】spring5特性
1、整个 Spring5 框架的代码基于 Java8,运行时兼容 JDK9,许多不建议使用的类和方 法在代码库中删除 日志框架 2、Spring 5.0 框架自带了通用的日志封装 (1)Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
