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

诡异的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是一个非常常规的驼峰命名,又不是isSuccesscAppId这种不规范命名。

编译后的代码如下,没有问题
在这里插入图片描述

调试

在DTO里的字段加断点调试,
在这里插入图片描述
在Controller层加断点调试说明@JsonProperty生效:
在这里插入图片描述

为啥呢??

一个比较相似的blog,不过他这篇里的命名不太规范。

参考

相关文章:

诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录

问题 一个非常常规的Spring Controller&#xff0c;代码如下&#xff1a; import lombok.RequiredArgsConstructor;Slf4j RestController RequiredArgsConstructor RequestMapping("/api/v1/config") public class ConfigController {private final ConfigService …...

YOLOv10改进,YOLOv10检测头融合RFAConv卷积,添加小目标检测层(四头检测)+CA注意机制,全网首发

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...

周末总结(2024/01/18)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…...

LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145212097 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…...

【软件开发过程管理规范】需求管理,需求分析,设计开发管理,测试管理(Word)

一、需求管理规程 1 简介 2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 准备阶段 3.2 需求调研 3.3 需求分析 软件开发人员及用户往往容易忽略信息沟通&#xff0c;这导致软件开发出来后不能很好地满足用户的需要&#xff0c;从而造成返工。而返工不仅在技术…...

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域&#xff0c;它涉及到网络系统的硬件、软件以及数据的安全保护&#xff0c;确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施&#xff0c;保…...

RPA编程实践:Electron实践开始

文章目录 前言闲话少叙&#xff0c;打开官网版本发布安装在 Windows 上安装在 macOS 上安装在 Linux (Ubuntu) 上安装 前言 上回说道&#xff0c;我们electron适合于熟悉web开发&#xff0c;但想要研发桌面应用的人。 但我觉得这个需求应该不是很多。 因为使用electron&#…...

ORB-SLAM2源码学习:MapPoint.cc④: 新增地图点总结

前言 让我们来总结ORB-SLAM2 中的新增地图点。 1.在第一阶段跟踪中的恒速模型跟踪中新增地图点 针对双目相机或RGB-D相机&#xff0c;找出上一帧中具有有效深度值且不是地图点的特征点&#xff0c;将其中较近的点作为上一帧新的临时地图点&#xff0c; 并记录在向扯mlpTempo…...

2025西湖论剑-babytrace

前言 就做了下题目&#xff0c;pwn1/3 都是签到&#xff0c;pwn2 后面绕 ptrace 有点意思&#xff0c;简单记录一下 漏洞分析 子进程中的读/写功能没有检查负数的情况&#xff0c;存在越界读写&#xff1a; void __fastcall get_value(__int64 *int64_arr) {__int64 ll; //…...

绘图专用,26个常见流程图符号及其解释

关注作者 当您设计网站、构建应用程序或绘制业务系统时&#xff0c;您需要一种方法来清晰地绘制步骤和用户流程。虽然您可以使用流程图来概述这些过程&#xff0c;但箭头和方框只能帮助您到目前为止。为了清楚地表达您的意思&#xff0c;您需要流程图符号。 为了帮助解释每个流…...

【个人学习记录】软件开发生命周期(SDLC)是什么?

软件开发生命周期&#xff08;Software Development Life Cycle&#xff0c;SDLC&#xff09;是一个用于规划、创建、测试和部署信息系统的结构化过程。它包含以下主要阶段&#xff1a; 需求分析&#xff08;Requirements Analysis&#xff09; 收集并分析用户需求定义系统目标…...

自学SpringBoot笔记

概念 什么是SpringBoot&#xff1f; Spring Boot 是基于 Spring Framework 的一款开源框架&#xff0c;主要用于简化 Spring 应用程序的开发。它通过提供一系列的 开箱即用的功能 和 自动配置&#xff0c;让开发者可以快速构建生产级别的独立应用程序&#xff0c;而无需手动配…...

03JavaWeb——Ajax-Vue-Element(项目实战)

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…...

[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、日常开发团队要求规范&#xff0c;需要对开发需求代码进行单元测试并要求行覆盖率达到要求&#xff0c;DevOps流水线也会开设相关门禁阀值阻断代码提交&#xff0c;一般新增代码行覆盖率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报错信息&#xff0c;猜测是navicat默认连接超时导致的&#xff0c;后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错&#xff0c;网上有人mysql驱动与数据库不匹…...

在线图片像素颜色拾取工具

在线图片像素颜色拾取工具&#xff0c;非常方便的一个工具&#xff0c;无需登录&#xff0c;用完就走。 包括中文和英文版本。 https://getcolor.openai2025.com...

Qt之登录界面(splash)

在上一篇多文档窗口设计(MDI)的基础上增加了一个登录界面&#xff08;splash&#xff09;. 该模块可以扩展为常规的软件登录界面。 界面展示如下 如果用户名和密码输入正确&#xff0c;则调到MDI界面&#xff0c;如果用户名和密码一共输入三次以上&#xff0c;则程序强制退出…...

NotebookLM:Google 最新 AI 笔记助理解析与实战应用

NotebookLM&#xff1a;Google 最新 AI 笔记助理解析与实战应用 在 AI 驱动的生产力工具不断进化的今天&#xff0c;Google 推出的 NotebookLM&#xff08;Notebook Language Model&#xff09;成为了一款备受关注的智能笔记助理。它结合了 Google 的大语言模型&#xff08;LL…...

Qwen3-Reranker-4B部署教程:适配A10/A100/V100的GPU算力优化配置

Qwen3-Reranker-4B部署教程&#xff1a;适配A10/A100/V100的GPU算力优化配置 本文手把手教你如何在A10/A100/V100等主流GPU上部署Qwen3-Reranker-4B模型&#xff0c;从环境准备到服务调用&#xff0c;提供完整的优化配置方案。 1. 认识Qwen3-Reranker-4B模型 Qwen3-Reranker-4…...

软件欺诈检测中的行为分析模型

**软件欺诈检测中的行为分析模型&#xff1a;智能守护数字安全** 在数字化时代&#xff0c;软件欺诈行为日益猖獗&#xff0c;从虚假交易到恶意爬虫&#xff0c;欺诈手段层出不穷。传统的规则检测方法已难以应对复杂多变的攻击模式&#xff0c;而基于行为分析的模型凭借其动态…...

【GPT-5时代生存指南】:为什么92%的企业微调失败?2026奇点大会首席科学家亲授4步精准对齐法

第一章&#xff1a;GPT-5时代企业微调失败的系统性归因 2026奇点智能技术大会(https://ml-summit.org) 在GPT-5模型架构全面转向混合专家&#xff08;MoE&#xff09; 动态稀疏激活范式后&#xff0c;传统基于全参数微调&#xff08;Full Fine-tuning&#xff09;或LoRA适配器…...

网安护网面试-3-鸿鹄科技护网面试

以下为已总结“网络安全”及“护网”面试&#xff0c;均在&#xff1a;(https://www.haotaoyun.com/category/soc “网安 护网”终极 300 多问题面试笔记 - 全“网安 护网”终极 300 多问题面试笔记 - 1 共 3 - 内网 & 域相关“网安 护网”终极 300 多问题面试笔记 - 2…...

租户数据泄露风险飙升87%!2026奇点大会权威发布大模型多租户隔离黄金标准,仅限首批200家认证企业获取

第一章&#xff1a;2026奇点智能技术大会&#xff1a;大模型多租户隔离 2026奇点智能技术大会(https://ml-summit.org) 核心挑战与设计目标 在千级租户共用同一基座大模型的生产环境中&#xff0c;逻辑隔离、资源配额、推理上下文污染及微调权重泄露构成关键风险。2026奇点智…...

5行代码实现智能图像动画:Spring库与Core ML的视觉交互革命

5行代码实现智能图像动画&#xff1a;Spring库与Core ML的视觉交互革命 【免费下载链接】Spring A library to simplify iOS animations in Swift. 项目地址: https://gitcode.com/gh_mirrors/sp/Spring Spring是一款专为iOS开发者打造的动画库&#xff0c;通过简洁的AP…...

Java性能调优实战:如何用IBM Thread and Monitor Dump Analyzer快速定位死锁问题

Java性能调优实战&#xff1a;如何用IBM Thread and Monitor Dump Analyzer快速定位死锁问题 在分布式系统和高并发场景下&#xff0c;Java应用的线程死锁问题如同潜伏的暗礁&#xff0c;随时可能让整个系统陷入瘫痪。作为开发者&#xff0c;我们需要的不仅是一把螺丝刀&#x…...

FLUX.1-dev像素模型实战教程:自定义LoRA训练数据集构建指南

FLUX.1-dev像素模型实战教程&#xff1a;自定义LoRA训练数据集构建指南 1. 像素艺术生成新纪元 像素幻梦(Pixel Dream Workshop)是基于FLUX.1-dev扩散模型构建的下一代像素艺术生成工具。与传统AI绘图工具不同&#xff0c;它专为像素艺术创作优化&#xff0c;采用明亮的16-bi…...

车辆三自由度运动学模型; Carsim_Simulink联合仿真; 无人驾驶车辆模型预测控制(2.1);

车辆三自由度运动学模型&#xff1b; Carsim/Simulink联合仿真&#xff1b; 无人驾驶车辆模型预测控制&#xff08;2.1&#xff09;&#xff1b; 包括Carsim的设置、控制信号数据、PPT文件、cpar件、车辆运动分析图&#xff08;适用于word两栏布局&#xff09;&#xff1b;Simu…...

我不是在用 AI 助手,我在把自己的能力沉淀成组织资产淳

1. 什么是 Apache SeaTunnel&#xff1f; Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题&#xff0c;如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...