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请求截图

排查与解决方法
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

