You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求Payload有值但Controller的@RequestBody参数为null问题排查

问题分析与解决方案

你遇到的问题是:通过AJAX发送PUT请求更新Recipe时,请求Payload格式正确(如{"name": "test"}),但Spring Controller中UpdateRecipeCommand的name属性始终为null,而逻辑一致的Product更新接口(仅少一个@PathVariable)能正常工作。

以下是针对性的解决方向:

1. 确认Jackson对Java Record的支持

Java Record是Java 14+特性,Jackson从2.10版本开始才正式支持Record的序列化/反序列化。如果你的Spring Boot版本低于2.2.x(对应Jackson 2.10),会存在兼容性问题。

解决方法:

  • 升级Spring Boot到2.2+版本;
  • 或者将UpdateRecipeCommand从Record改为普通POJO类,添加getter/setter或使用Lombok的@Data注解:
import lombok.Data;

@Data
public class UpdateRecipeCommand {
    private String name;
}

2. 显式指定JSON字段映射

虽然Record的字段名默认会和JSON键名对应,但有时序列化配置可能导致匹配失败,显式添加@JsonProperty可强制映射:

import com.fasterxml.jackson.annotation.JsonProperty;

public record UpdateRecipeCommand(@JsonProperty("name") String name){}

3. 验证请求头与请求体的正确性

  • 在浏览器开发者工具的Network标签中,确认请求的Content-Type头确实是application/json,避免jQuery AJAX因特殊情况自动修改请求头;
  • 检查请求体的JSON格式是否严格符合标准:确保键名用双引号包裹({"name":"test"}而非{name:"test"}),你当前的JSON.stringify({name: newName})已生成正确格式,但可在控制台打印该结果再次确认。

4. 排除路径变量的潜在冲突

虽然@PathVariable理论上不会影响@RequestBody的解析,但可尝试以下操作排除冲突:

  • 暂时移除productId路径变量,简化接口测试,看是否能正常接收参数;
  • 确认@PutMapping的路径与AJAX的url完全匹配,避免路径映射错误导致请求被其他处理器拦截。

5. 直接用Postman测试后端接口

绕过前端,用Postman发送PUT请求到/recipes/{productId}/{recipeId},请求体为{"name":"test"},如果后端仍无法接收参数,说明问题出在后端配置而非前端代码,可进一步排查Spring的消息转换器配置。


内容的提问来源于stack exchange,提问作者Thomarkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:20