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

Spring Controller中@RequestPart接收JSON对象始终为null问题

Spring Controller中@RequestPart接收JSON对象始终为null的排查解决

问题说明

在Spring Controller的createCompanyDetail接口中,使用@RequestPart注解接收CompanyDetailsData类型的JSON对象dataObject时,始终获取到null值。该接口通过@PostMapping定义,同时支持multipart/form-data、application/json、application/xml请求类型,还需接收MultipartFile类型的companyLogo参数。

相关代码

Controller代码

@Secured({ "ROLE_CLIENT", "ROLE_TRUSTED_CLIENT", "ROLE_CUSTOMERMANAGERGROUP","ROLE_CUSTOMERGROUP" })
@PostMapping(value = "/create", consumes ={ MediaType.MULTIPART_FORM_DATA_VALUE , MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
@ResponseBody
@ApiOperation(nickname = "SaveCompanyDetail", value = " Saves Company Detail", notes = "Saves Company Detail requires the WsDTO with the customer data.", produces = MediaType.APPLICATION_JSON_VALUE)
@ApiBaseSiteIdParam
public String createCompanyDetail(@RequestPart(value = "companyDetails", required = false) final CompanyDetailsData dataObject,  @RequestPart(value = "companyLogo", required = false) final MultipartFile companyLogo) {
    try {
        // dataObject始终为null
    } catch (Exception ex) {
        LOG.error("createCompanyDetail :: ",ex.getMessage());
        return FAILED;
    }
    return SUCCESS;
}

实体类代码

public class CompanyDetailsData implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String email;
    private String title;
    private String phoneNumber;
}

请求Payload示例

{
"id": "123",
"email": "string",
"phoneNumber": "string",
"title": "title test"
}

Postman请求截图

Postman请求截图

排查与解决方法

1. 实体类缺失getter/setter方法

Spring在将请求数据映射到实体类时,依赖字段的getter和setter方法完成赋值。当前CompanyDetailsData仅定义了字段,没有对应的访问方法,导致无法完成对象实例化和赋值。

  • 解决:给所有字段添加getter、setter方法,或使用Lombok的@Data注解自动生成:
    @Data
    public class CompanyDetailsData implements Serializable {
        private static final long serialVersionUID = 1L;
        private String id;
        private String email;
        private String title;
        private String phoneNumber;
    }
    

2. 请求Part的Content-Type未正确设置

使用multipart/form-data请求时,@RequestPart要求JSON类型的表单Part必须指定Content-Type: application/json,否则Spring无法识别并解析为Java对象。

  • 解决:在Postman中配置请求时:
    • 选择form-data类型,添加companyDetails参数,类型选择raw,格式切换为JSON;
    • 填入对应的JSON payload,Postman会自动为该Part设置正确的Content-Type;
    • 确保请求头的Content-Type为multipart/form-data(选择form-data后Postman会自动设置)。

3. 请求参数名不匹配

确认请求中表单参数的名称与@RequestPart注解的value属性完全一致,即必须为companyDetails,大小写敏感。

4. 多请求类型兼容问题

接口同时声明支持多种consumes类型,若发送请求时的Content-Type与实际请求格式不匹配,会导致解析失败。比如发送纯JSON请求时用application/json,此时应使用@RequestBody而非@RequestPart;若需传输文件+JSON,必须用multipart/form-data并按上述方式配置Part。

  • 优化建议:可拆分接口分别处理不同请求场景,或通过判断请求头动态适配解析方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:43:15