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

key,value,isDef关键字的隐藏bug

key,value,isDef关键字的隐藏bug

前言:
有个老师傅创建表用关键字,返回的response用特殊字符导致的问题

1 ,表创建用到了关键字

表如下:

CREATE TABLE `system_xxx_config`(`id` BIGINT NOTNULLCOMMENT'主键'PRIMARY KEY,`key`varchar(255)NOTNULLCOMMENT'配置文件key',`value`varchar(512)NOTNULLCOMMENT'配置文件value',...)COMMENT'xxx配置表'COLLATE=utf8mb4_unicode_ci;

正常我们写接口,使用BaseMapper集成 MyBatis实现简单的crud
代码如下

@Override public R<GlobalConfigVo>queryxxxConfigVoByKey(String key){GlobalConfigVo configVo=newGlobalConfigVo();GlobalConfigDO configDO=globalConfigMapper.selectOne(GlobalConfigDO::getKey,key);if(Objects.isNull(configDO)){returnCommonResult.success(configVo);}BeanUtils.copyProperties(configDO,configVo);returnCommonResult.success(configVo);}

但是就是报

SQL: SELECT id, key, value, deleted, create_time, update_time, creator, updater, x_channel, x_platform FROM system_global_config WHERE deleted = 0 AND (key= ?)

Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘key, value, deleted, create_time, update_time, creator, xx,’ at line 1

; bad SQL grammar []
2025-12-23 16:53:55.138 | ERROR 7 | http-nio-48091-exec-7 [TID: N/A] | [USER_ID: 1950821235660029954] [USER_IP: 42.99.63.70] [X_CHANNEL: zp] [X_PLATFORM: middleAndroid] [DEVICE_ID: 123321] [VERSION: 1.1.0.0.1] [REQUEST_ID: 2f9275a4-c754-4122xxxa902-93c241c54947] | c.h.f.w.c.h.
简单的说就是 使用key 、value 关键字,mybatis自动生成的sql用不了,会报错。

尝试

@Override public R<GlobalxxConfigVo>queryGlobalxxxConfigVoByKey(String key){LambdaQueryWrapper<GlobalxxConfigDO>wrapper=new LambdaQueryWrapper<>();wrapper.eq(GlobalxxxConfigDO::getKey,key).eq(GlobalxxConfigDO::getDeleted,0);GlobalxxConfigDO configDO=globalxxConfigMapper.selectOne(wrapper);GlobalxxConfigVo configVo=newGlobalxxxConfigVo();BeanUtils.copyProperties(configDO,configVo);returnR.success(configVo);}

还是报错误,
最终写
sql 做mapper映射解决bug
select xxx from xxx where xxx;

2、response返回值封装触发关键字 isDef

{"code":220,"data":[{"config":"1024x","isDef":true},{"config":"2048x","isDef":false}],"msg":""}

正常封装对象:

@Data @NoArgsConstructor @AllArgsConstructor public class GlobalxxxConfigVo{private String config;private boolean isDef;}

写好后返回是:

{"code":220,"data":[{"config":"1024x","def":true},{"config":"2048x","def":false}],"msg":""}

查询原因是
问题分析:
在Java中,使用Lombok的@Data注解时,对于布尔类型的字段,Lombok生成的getter方法命名规则为:如果是基本类型boolean,字段名为isDef,则生成的getter方法为isDef(),setter方法为setDef(boolean)。但是,在序列化为JSON时,Jackson等序列化框架默认使用getter方法来确定字段名。对于布尔类型,可能会产生混淆。

字段名为isDef,Lombok生成的getter方法为isDef(),setter为setDef(boolean)。序列化框架可能会将字段名解析为def(因为getter方法名为isDef,去掉is后,首字母小写为def),所以返回的JSON中出现了def字段。

解决方案:

使用Jackson的@JsonProperty注解,指定序列化时的字段名。

@Data @NoArgsConstructor @AllArgsConstructor public class GlobalxxxConfigVo{/** * 视频彩铃分配率 */private String config;/** * 如果匹配默认的就是true 没有匹配到就是false */@JsonProperty("isDef")private boolean isDef;}

都是师傅学到了。。。。

喜欢我的文章记得点个在看,或者点赞,持续更新中ing…

http://www.hn-smt.com/news/141364/

相关文章:

  • 设计师必看:10个免费Adobe Illustrator脚本让你的效率翻倍
  • 如何在10分钟内搭建专属Galgame交流平台:TouchGAL零基础快速配置技巧
  • RevokeMsgPatcher资源管理机制深度技术解析:如何高效管理防撤回补丁资源
  • 如何快速打造高精度谐波赤道仪:DIY天文设备的终极指南
  • 如何快速掌握xcms:代谢组学新手的完整实战指南
  • 免费音频编辑器Audacity:3步搞定专业级音频剪辑
  • CREO到URDF转换终极指南:快速构建机器人仿真模型
  • 惠普暗影精灵笔记本性能控制终极指南:OmenSuperHub全面评测
  • 基于FPGA的加法器设计:完整指南
  • Windows平台PS3手柄蓝牙驱动完全解决方案
  • 图解说明Vivado许可证文件路径设置与优先级规则
  • Snap.Hutao:重新定义你的原神游戏数据管理体验
  • WinClean:Windows系统终极优化与清理完整指南
  • 解放双手!VideoSrt智能字幕工具:5分钟搞定视频字幕制作全流程
  • 26、F语言导向编程与跨语言互操作性详解
  • 17、使用Xamarin.Forms构建跨平台应用程序的全面指南
  • RevokeMsgPatcher终极指南:轻松实现微信QQ消息防撤回
  • BG3模组管理器完全指南:5分钟掌握博德之门3模组管理技巧
  • VideoSrt:智能字幕生成的终极解决方案
  • OmenSuperHub终极指南:简单三步彻底释放惠普游戏本性能潜力
  • PPTist在线演示工具新手指南:轻松创作专业级幻灯片
  • 7、构建可扩展且容错的 CI/CD 管道
  • 1、AWS自动化:从版本控制到持续部署的全面指南
  • 如何评估anything-llm镜像的实际效果?关键指标解读
  • 推荐一款超强的蓝牙模块+零代码App开发平台,快速搭建物联网应用
  • Unlock Music浏览器音频解密:5分钟掌握跨平台音乐转换核心技术
  • ComfyUI ControlNet Aux预处理器全功能整合技术解析
  • Mac百度网盘下载加速终极指南:免费解锁SVIP高速体验
  • 赛马娘本地化插件完整使用指南
  • 终极音频解密工具完整指南:一键解锁加密音乐文件