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

Spring Boot如何将单个JSON映射至两个实体类?

Spring Boot Controller 处理跨实体类的JSON参数映射

嘿,这个场景我经常碰到,其实用DTO(数据传输对象)做中转是最清晰的解决方案,我给你一步步拆解怎么实现:

第一步:创建DTO类接收前端JSON

因为前端提交的JSON包含了分属两个实体类的字段,我们先定义一个专门的DTO来接收这些参数,这样既符合前端的传参结构,又能方便地转换为后端的实体类:

// 接收前端请求的DTO类
public class EmployeeRequestDTO {
    private String empName;
    private String empAddress;

    // 生成Getters和Setters
    // 如果项目用了Lombok,直接加@Data注解就能省去这些代码
    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getEmpAddress() {
        return empAddress;
    }

    public void setEmpAddress(String empAddress) {
        this.empAddress = empAddress;
    }
}

第二步:编写Controller处理请求

在Controller里,我们用@RequestBody接收DTO对象,然后把它拆分成Employee和EmployeeAddress两个实体类,再调用Service层完成持久化操作:

@RestController
@RequestMapping("/employees")
public class EmployeeController {

    // 注入Service层(推荐用构造方法注入,比@Autowired更规范)
    private final EmployeeService employeeService;

    public EmployeeController(EmployeeService employeeService) {
        this.employeeService = employeeService;
    }

    @PostMapping
    public ResponseEntity<String> createEmployee(@RequestBody EmployeeRequestDTO requestDTO) {
        // 1. 构建Employee实体
        Employee employee = new Employee();
        employee.setEmpName(requestDTO.getEmpName());
        // 如果emId是数据库自增主键,这里不需要手动设置,保存后会自动生成

        // 2. 先保存Employee,获取自动生成的emId
        Employee savedEmployee = employeeService.saveEmployee(employee);

        // 3. 构建EmployeeAddress实体,并关联同一个emId
        EmployeeAddress employeeAddress = new EmployeeAddress();
        employeeAddress.setEmId(savedEmployee.getEmId());
        employeeAddress.setEmpAddress(requestDTO.getEmpAddress());

        // 4. 保存地址实体
        employeeService.saveEmployeeAddress(employeeAddress);

        return ResponseEntity.ok("员工信息创建成功");
    }
}

第三步:补充Service层逻辑(可选但推荐)

为了遵循分层架构,我们把数据库操作放到Service层,这里给你一个简单的示例:

@Service
public class EmployeeService {

    // 注入JPA Repository(需要你提前定义好对应的Repository接口)
    private final EmployeeRepository employeeRepository;
    private final EmployeeAddressRepository addressRepository;

    // 构造方法注入
    public EmployeeService(EmployeeRepository employeeRepository, EmployeeAddressRepository addressRepository) {
        this.employeeRepository = employeeRepository;
        this.addressRepository = addressRepository;
    }

    public Employee saveEmployee(Employee employee) {
        return employeeRepository.save(employee);
    }

    public EmployeeAddress saveEmployeeAddress(EmployeeAddress address) {
        return addressRepository.save(address);
    }
}

为什么用DTO?

直接用实体类接收的话,Spring没法自动把empAddress字段映射到EmployeeAddress实体里,而DTO作为中间层,既能完美匹配前端的传参结构,又能灵活地转换为后端的各个实体类,同时也避免了直接暴露实体类的内部结构,是这种场景下的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:36:37