Spring中能否用@RequestBody接收多个Model?附场景示例
Spring Rest控制器接收多实体请求的正确方式
你当前的写法存在错误:一个HTTP POST请求只能包含一个请求体,因此在同一个控制器方法中使用两个@RequestBody注解是不合法的,Spring无法解析这种情况,会直接抛出异常。
以下是两种可行的解决方案:
方案一:创建请求DTO(推荐)
创建专门的请求数据传输对象(DTO),整合User和Cars需要接收的字段,或者直接包含两个实体对象,根据你的JSON格式选择。
情况1:保持扁平JSON格式
如果要接收你提供的扁平结构JSON:
{ "firstname": "Smith", "type": "kfc", // 其他字段... }
创建对应的DTO类:
public class UserCarRequest { // User相关字段 private String firstname; // 可添加User的其他字段... // Cars相关字段 private String type; private String year; // 可添加Cars的其他字段... // 生成所有字段的getter和setter方法 public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getType() { return type; } public void setType(String type) { this.type = type; } // 其他字段的getter/setter }
修改控制器方法,接收这个DTO并转换为实体:
@PostMapping("add") public String save(@RequestBody UserCarRequest request) { // 转换为User实体 User user = new User(); user.setFirstname(request.getFirstname()); // 设置User的其他字段... // 转换为Cars实体 Cars cars = new Cars(); cars.setType(request.getType()); // 设置Cars的其他字段,比如owner可以关联保存后的User ID // cars.setOwner(user.getId()); // 调用业务层保存实体 // userRepository.save(user); // carsRepository.save(cars); return "success"; }
情况2:使用嵌套JSON格式
如果调整JSON为嵌套结构,可读性更强:
{ "user": { "firstname": "Smith" // User其他字段... }, "cars": { "type": "kfc" // Cars其他字段... } }
DTO类可以直接包含两个实体:
public class UserCarRequest { private User user; private Cars cars; // getter和setter public User getUser() { return user; } public void setUser(User user) { this.user = user; } public Cars getCars() { return cars; } public void setCars(Cars cars) { this.cars = cars; } }
控制器方法简化为:
@PostMapping("add") public String save(@RequestBody UserCarRequest request) { User user = request.getUser(); Cars cars = request.getCars(); // 保存逻辑,注意关联owner字段 // userRepository.save(user); // cars.setOwner(user.getId()); // carsRepository.save(cars); return "success"; }
方案二:使用Map接收(不推荐)
如果不想创建DTO,可以用Map<String, Object>接收请求体,手动转换为实体,但这种方式类型不安全,容易出现转换异常:
@PostMapping("add") public String save(@RequestBody Map<String, Object> requestMap) { User user = new User(); user.setFirstname((String) requestMap.get("firstname")); // 手动转换其他User字段 Cars cars = new Cars(); cars.setType((String) requestMap.get("type")); // 手动转换其他Cars字段 // 保存逻辑 return "success"; }
内容的提问来源于stack exchange,提问作者dhanyn10
相关产品推荐
相关产品推荐

