诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录
问题
一个非常常规的Spring Controller,代码如下:
import lombok.RequiredArgsConstructor;@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/config")
public class ConfigController {private final ConfigService configService;@ApiOperation("新增配置")@PostMapping("")public R<ConfigVo> createConfig( /*@Valid*/ @RequestBody ConfigDto dto) {return R.success(configService.createConfig(dto));}
}
DTO定义如下:
import io.swagger.annotations.ApiModel;
import lombok.*;@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("配置")
public class ConfigDto {@NotBlankprivate String appId;private String json;private String mark;
}
Postman模拟一次POST请求:
{"mark": "verifyUserByIdAndName","json": "{}","appId": "a_15c140390de54948af88ad9b39d1fd2f"
}
代码逻辑不对劲,然后通过断点调试,发现appId字段为null:

WTF???有毒吧。
现象就是驼峰命名的字段解析不出来,映射不上。
@Valid
咨询DeepSeek,一大堆废话。提取到关键词@Valid。
给这个Controller加个@Valid注解,也就是上面的代码片段里被注释的/*@Valid*/,Postman请求报错:

这个报错是框架类的封装然后返回的。说明Spring(Jackson)确实没有从Postman的request里解析映射出appId字段。
框架类代码片段:
private static final MediaType MEDIA_TYPE = new MediaType("application", "json", StandardCharsets.UTF_8);/*** JSR303 表单参数校验失败* 在Controller层使用@Valid注解*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity<R<?>> handleMethodArgumentNotValidException(MethodArgumentNotValidException e,HttpServletRequest request) {this.logWarn(e, request, "不合法的参数异常");InvalidField invalidField = getInvalidField(e.getBindingResult());R<InvalidField> invalidFieldR = new R<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), "不合法的参数异常", invalidField);return createResponseEntity(HttpStatus.BAD_REQUEST, invalidFieldR);
}private void logWarn(Exception e, HttpServletRequest request, String... msg) {String template = "[Web][有Warn被抛出] >> Warn类=[%s], URI=[%s], 消息=[%s], Warn=[%s]";log.warn(String.format(template, e.getClass().getName(), request.getRequestURI(),ArrayUtil.isEmpty(msg) ? e.getMessage() : ArrayUtil.join(msg, ","), ExceptionUtil.stacktraceToString(e)));
}private InvalidField getInvalidField(BindingResult bindingResult) {if (bindingResult == null) {return null;}FieldError fieldError = bindingResult.getFieldError();if (fieldError == null) {return null;}return InvalidField.builder().fieldName(fieldError.getField()).message(fieldError.getDefaultMessage()).build();
}protected static ResponseEntity<R<?>> createResponseEntity(HttpStatus httpStatus, R<?> body) {return ResponseEntity.status(httpStatus.value()).contentType(MEDIA_TYPE).body(body);
}@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class InvalidField {private String fieldName;private String message;
}
断点调试截图:

workaround
继续询问DeepSeek,又是一大堆废话,提取到关键词@JsonProperty。
一开始并没有关注这个,因为这个注解的使用场景是字段命名不匹配。
试试吧,增加@JsonProperty("appId"),也就是
public class ConfigDto {@NotBlank@JsonProperty("appId")private String appId;
}
能解析到appId字段。
但是!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这两个地方的命名,明明是一模一样的啊。
分析
为啥呢?
Lombok
不是Lombok的问题,其他字段都没有问题,再说appId是一个非常常规的驼峰命名,又不是isSuccess或cAppId这种不规范命名。
编译后的代码如下,没有问题

调试
在DTO里的字段加断点调试,

在Controller层加断点调试说明@JsonProperty生效:

为啥呢??
一个比较相似的blog,不过他这篇里的命名不太规范。
参考
相关文章:
诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录
问题 一个非常常规的Spring Controller,代码如下: import lombok.RequiredArgsConstructor;Slf4j RestController RequiredArgsConstructor RequestMapping("/api/v1/config") public class ConfigController {private final ConfigService …...
YOLOv10改进,YOLOv10检测头融合RFAConv卷积,添加小目标检测层(四头检测)+CA注意机制,全网首发
摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...
周末总结(2024/01/18)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145212097 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…...
【软件开发过程管理规范】需求管理,需求分析,设计开发管理,测试管理(Word)
一、需求管理规程 1 简介 2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 准备阶段 3.2 需求调研 3.3 需求分析 软件开发人员及用户往往容易忽略信息沟通,这导致软件开发出来后不能很好地满足用户的需要,从而造成返工。而返工不仅在技术…...
计算机网络 (49)网络安全问题概述
前言 计算机网络安全问题是一个复杂且多维的领域,它涉及到网络系统的硬件、软件以及数据的安全保护,确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施,保…...
RPA编程实践:Electron实践开始
文章目录 前言闲话少叙,打开官网版本发布安装在 Windows 上安装在 macOS 上安装在 Linux (Ubuntu) 上安装 前言 上回说道,我们electron适合于熟悉web开发,但想要研发桌面应用的人。 但我觉得这个需求应该不是很多。 因为使用electron&#…...
ORB-SLAM2源码学习:MapPoint.cc④: 新增地图点总结
前言 让我们来总结ORB-SLAM2 中的新增地图点。 1.在第一阶段跟踪中的恒速模型跟踪中新增地图点 针对双目相机或RGB-D相机,找出上一帧中具有有效深度值且不是地图点的特征点,将其中较近的点作为上一帧新的临时地图点, 并记录在向扯mlpTempo…...
2025西湖论剑-babytrace
前言 就做了下题目,pwn1/3 都是签到,pwn2 后面绕 ptrace 有点意思,简单记录一下 漏洞分析 子进程中的读/写功能没有检查负数的情况,存在越界读写: void __fastcall get_value(__int64 *int64_arr) {__int64 ll; //…...
绘图专用,26个常见流程图符号及其解释
关注作者 当您设计网站、构建应用程序或绘制业务系统时,您需要一种方法来清晰地绘制步骤和用户流程。虽然您可以使用流程图来概述这些过程,但箭头和方框只能帮助您到目前为止。为了清楚地表达您的意思,您需要流程图符号。 为了帮助解释每个流…...
【个人学习记录】软件开发生命周期(SDLC)是什么?
软件开发生命周期(Software Development Life Cycle,SDLC)是一个用于规划、创建、测试和部署信息系统的结构化过程。它包含以下主要阶段: 需求分析(Requirements Analysis) 收集并分析用户需求定义系统目标…...
自学SpringBoot笔记
概念 什么是SpringBoot? Spring Boot 是基于 Spring Framework 的一款开源框架,主要用于简化 Spring 应用程序的开发。它通过提供一系列的 开箱即用的功能 和 自动配置,让开发者可以快速构建生产级别的独立应用程序,而无需手动配…...
03JavaWeb——Ajax-Vue-Element(项目实战)
1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据,如下图所示的表格中的学生信息,应该来自于后台,那么我们的后台和前端是互不影响的2个程序,那么我们前端应该如何从后台获取数据呢?因为是2个程序…...
[leetcode](找到vector中的特定元素并删除)无重复字符的最长子串
一.找到vector中的特定元素并删除 #include <iostream> #include <vector> #include <algorithm> int main() { // 示例 vector std::vector<int> vec {1, 2, 3, 4, 5, 6}; // 要删除的元素 int aim 3; // 查找元素 auto it std::fin…...
Mockito+PowerMock+Junit单元测试
一、单元测试用途 1、日常开发团队要求规范,需要对开发需求代码进行单元测试并要求行覆盖率达到要求,DevOps流水线也会开设相关门禁阀值阻断代码提交,一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于…...
Ncat: bind to :::7777: Address already in use报错问题解决
问题描述 Ncat: bind to :::7777: Address already in use. QUITTING. 具体解决方法 If you are in linux environment try, Use netstat -tulpn to display the processeskill -9 <pid> This will terminate the process If you are using windows, Use netstat -…...
Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错,禁用dns
1.本地连接Navicat报错信息,猜测是navicat默认连接超时导致的,后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错,网上有人mysql驱动与数据库不匹…...
在线图片像素颜色拾取工具
在线图片像素颜色拾取工具,非常方便的一个工具,无需登录,用完就走。 包括中文和英文版本。 https://getcolor.openai2025.com...
Qt之登录界面(splash)
在上一篇多文档窗口设计(MDI)的基础上增加了一个登录界面(splash). 该模块可以扩展为常规的软件登录界面。 界面展示如下 如果用户名和密码输入正确,则调到MDI界面,如果用户名和密码一共输入三次以上,则程序强制退出…...
NotebookLM:Google 最新 AI 笔记助理解析与实战应用
NotebookLM:Google 最新 AI 笔记助理解析与实战应用 在 AI 驱动的生产力工具不断进化的今天,Google 推出的 NotebookLM(Notebook Language Model)成为了一款备受关注的智能笔记助理。它结合了 Google 的大语言模型(LL…...
Langchain Agent实战避坑:用通义千问调用高德API,我踩过的异步和工具定义那些坑
Langchain Agent实战避坑指南:异步调用与工具定义的那些坑 在构建基于Langchain的智能代理时,异步调用和工具定义是两个最容易让开发者踩坑的领域。本文将分享我在使用通义千问模型调用高德API过程中遇到的实际问题及其解决方案。 1. 异步调用的常见陷阱…...
Xmake进阶指南---打造高效Qt开发工作流
1. 为什么选择Xmake构建Qt项目? 第一次接触Qt开发的朋友,往往会被官方推荐的qmake或CMake构建工具劝退。我至今记得五年前接手一个遗留Qt项目时,面对.pro文件中晦涩的语法和复杂的平台条件判断,整整花了两天才让项目正常编译。直到…...
终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证
终极指南:如何使用Apache Shiro与JWT实现现代Web应用的无状态认证 【免费下载链接】shiro Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management 项目地址: …...
避坑指南:为MATLAB 2023b配置CCS12.2+C2000ware 4.03黄金开发环境
MATLAB 2023b与CCS12.2C2000ware 4.03开发环境配置全攻略 当工程师们开始搭建基于TI C2000和MATLAB的模型化设计工作流时,环境配置往往是第一个需要跨越的门槛。特别是对于MATLAB 2023b这样的新版本,选择与之匹配的工具链版本至关重要。本文将深入探讨如…...
记录复现多模态大模型论文OPERA的一周工作()杖
pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...
实战分享:我把Qwen2.5-7B-Instruct变成专属文本分类器,LlamaFactory LoRA微调+推理加速全记录
从零构建Qwen2.5-7B文本分类引擎:LlamaFactory LoRA微调与vLLM推理加速实战 去年接手一个政务文本分类项目时,传统BERT模型在长文本场景下的表现让我屡次陷入调参困境。直到尝试用Qwen2.5-7B-Instruct配合LlamaFactory进行LoRA微调,才发现大语…...
MiniMax M. 发布!Redis 故障排查 + 跨语言重构场景实测,表现如何?确
一、前言:什么是 OFA VQA 模型? OFA(One For All)是字节跳动提出的多模态预训练模型,支持视觉问答、图像描述、图像编辑等多种任务,其中视觉问答(VQA)是最常用的功能之一——输入一张…...
Arduino:解决手动解压ESP32库到packages文件夹,但Arduino IDE还是无法找到ESP32的问题
在学习使用Arduino时,如果需要在Arduino IDE里找到ESP32S3 DEV Module,一种方法是点击开发板管理器,搜索ESP32库,点击自动安装(如图1),安装完成方可使用,但是因为网络的原因…...
ST-LINK Reset and Run失效?教你3步搞定STM32复位问题
ST-LINK Reset and Run失效?3步精准定位STM32复位异常 最近在调试STM32项目时,遇到一个令人抓狂的问题——明明在Keil中勾选了Reset and Run选项,程序烧录后芯片却像睡着了一样毫无反应。这种看似简单的复位问题,往往藏着开发环境…...
记一次综合型流量分析 | 添柴不加火聪
核心摘要:这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景,告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”,并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...
