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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:30