Spring Boot 3中Java Record作为RequestBody无法正确绑定驼峰字段问题
Spring Boot 3 中 Java Record 作为 RequestBody 的绑定异常问题解析
核心原因
Spring Boot 3 升级后配套的 Jackson 版本(2.15+)对 Java Record 的字段命名处理逻辑和 Spring Boot 2 有明显差异:
- Spring Boot 2 里,Jackson 对 Record 字段兼容驼峰命名的自动匹配,即便没有注解也能正确绑定请求中的驼峰字段。
- 到了 Spring Boot 3,Jackson 默认会对 Record 的字段应用基于原始字段名的命名策略转换。如果你的项目全局配置了蛇形命名策略(
spring.jackson.property-naming-strategy=SNAKE_CASE,这也是 Spring Boot 3 常见的默认配置之一),Record 里的驼峰字段exampleData会被解析为example_data,导致请求中的exampleData无法匹配,最终绑定为null;而本身就是蛇形命名的example_data字段则能直接匹配,所以正常绑定。
解决方案
你可以通过以下几种方式解决这个问题:
1. 显式指定字段映射(最直接)
继续用@JsonProperty注解明确指定字段对应的 JSON 键名,示例:
public record ExampleRequestDto(@JsonProperty("exampleData") String exampleData) {}
2. 调整全局 Jackson 命名策略
如果希望全局保持驼峰命名的自动匹配,修改application.properties或application.yml中的配置:
# application.properties spring.jackson.property-naming-strategy=LOWER_CAMEL_CASE
YAML 格式:
# application.yml spring: jackson: property-naming-strategy: LOWER_CAMEL_CASE
这样 Jackson 会直接使用 Record 的驼峰字段名作为 JSON 键名,无需额外注解就能绑定请求中的exampleData。
3. 自定义 Jackson 模块(进阶方案)
如果需要更灵活的定制,可以创建自定义 Jackson 模块调整 Record 的字段命名规则,但这种方式复杂度较高,一般优先推荐前两种方案。
补充说明
Java Record 的字段访问器是直接以字段名命名的(比如exampleData()而非普通 Bean 的getExampleData()),和传统 Java Bean 的 getter 规则不同,Jackson 处理 Record 时会优先用字段原始名称来应用命名策略,这就是 Spring Boot 2 和 3 出现差异的核心原因。
内容的提问来源于stack exchange,提问作者user3414980
相关产品推荐
相关产品推荐

