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

记录jackson解析出错

Jackson 属性名大小写 Bug 记录

问题描述

在前后端交互过程中,前端传递的 JSON 字段名为驼峰风格(如 qTitle),后端 Java 实体类字段名也为驼峰(如 private String qTitle;)。
但在反序列化时,发现后端接收到的 qTitle 字段始终为 null,导致如 @NotBlank(message = "问卷标题不能为空") 校验失败。

现象

  • 前端请求体:
    {"qTitle": "2024年员工满意度调查问卷",...
    }
    
  • 后端实体类:
    public class QuestionnaireCreateRequest {@NotBlank(message = "问卷标题不能为空")private String qTitle;// ...
    }
    
  • 实际后端接收到的 qTitle 字段为 null,触发校验异常。

排查过程

  1. 确认前后端字段名一致,均为驼峰。
  2. 查看 Jackson 源码,定位到 legacyManglePropertyName 方法:
     /*** Method called to figure out name of the property, given * corresponding suggested name based on a method or field name.** @param basename Name of accessor/mutator method, not including prefix*  ("get"/"is"/"set")*/protected String legacyManglePropertyName(final String basename, final int offset){final int end = basename.length();if (end == offset) { // empty name, nopereturn null;}char c = basename.charAt(offset);// 12-Oct-2020, tatu: Additional configurability; allow checking that//    base name is acceptable (currently just by checking first character)if (_baseNameValidator != null) {if (!_baseNameValidator.accept(c, basename, offset)) {return null;}}// next check: is the first character upper case? If not, return as ischar d = Character.toLowerCase(c);if (c == d) {return basename.substring(offset);}// otherwise, lower case initial chars. Common case first, just one charStringBuilder sb = new StringBuilder(end - offset);sb.append(d);int i = offset+1;for (; i < end; ++i) {c = basename.charAt(i);d = Character.toLowerCase(c);if (c == d) {sb.append(basename, i, end);break;}sb.append(d);}return sb.toString();}
    
  3. 分析得出:
    • 如果属性名第一个字母是小写,第二个字母是大写(如 qTitle),Jackson 会将整个属性名转为小写(qtitle)。
    • 这导致 JSON 里的 qTitle 和 Java 字段 qTitle 匹配不上。

解决方案

  1. 推荐:避免使用单字母+大写字母的属性名。
    • 例如,将 qTitle 改为 questionTitle
  2. 如必须使用,添加 @JsonProperty 注解:
    @JsonProperty("qTitle")
    private String qTitle;
    
  3. 确保 Jackson 配置为默认大小写敏感,命名策略为 LOWER_CAMEL_CASE
  4. 团队命名规范建议:
    • 尽量使用完整单词命名,避免单字母+大写字母的驼峰风格。

总结

本次 bug 的根本原因是 Jackson 对属性名的“遗留”处理逻辑,遇到小写字母后紧跟大写字母的属性名时,会将整个属性名转为小写,导致前后端字段无法正确映射。
建议统一命名规范,或使用 @JsonProperty 明确指定字段名,彻底规避此类问题。

http://www.xdnf.cn/news/13884.html

相关文章:

  • 设计模式(二)
  • Python自动化办公工具开发实践:打造智能报表生成系统的心得与洞见
  • 3.ES索引、映射、字段和文档
  • 锂电池充电芯片XSP30,2-3节串联锂电池升降压充电管理芯片
  • FastAPI如何用角色权限让Web应用安全又灵活?
  • 探索现代 Web 开发:从 HTML5 到 Vue.js 的全栈之旅
  • Linux部署elasticsearch 单机版
  • 自然语言处理期末复习
  • 高效账号信息管理工具,可安全随机生成密码
  • VSCode如何优雅的debug python文件,包括外部命令uv run main.py等等
  • 理解与建模弹性膜-AI云计算数值分析和代码验证
  • LeetCode - 76. 最小覆盖子串
  • 三维激光雷达在智慧工厂物流测量中的应用分析
  • Python内存互斥与共享深度探索:从GIL到分布式内存的实战之旅
  • Oracle 中使用CONNECT BY、START WITH递归查询
  • 黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(下)
  • 今日行情明日机会——20250613
  • 胶囊网络破解图像旋转不变性难题 ——从空间关系到姿态矩阵的几何深度学习革命
  • 轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
  • 经济系统的「资源死锁」与「架构重构」:从通缩陷阱到可持续模型设计
  • MySQL(多表设计、多表查询)
  • Android S - 重复播放按键音(上下左右、OK)
  • Java详解LeetCode 热题 100(32):LeetCode 138. 随机链表的复制
  • Linux常用命令加强版替代品
  • 探索弹性弦行为:从绘图到问题解决-AI云计算数值分析和代码验证
  • 永不休眠:Linux 守护进程的工作原理
  • visual studio小番茄插件某些快捷键失效
  • 1万美元iO bounty破解之旅
  • android aosp源码下编码时避免引用aidl文件飘红不自动提示的方法
  • 神经网络压缩