如何在 RestController 中映射嵌套的 JSON?

How do I map an nested JSON in a RestController?

我正在尝试使用 Spring Boot 和 RestController 将嵌套的 JSON 保存在数据库中。那些 JSON 看起来像这样:

{ 
 "name": "Car 1", 
 "plate_number": "PLATE NUMBER",
 "owner": { 
            "first_name": "First name",
            "last_name": "Last name"
          }
}

在 RestController 中使用 spring 提供的自动映射很容易映射普通字段(姓名和车牌号):

public Car createProduct(Car car) {

}

但是现在,我如何将对象所有者映射到它自己的 class、CarOwner?(我需要提到我有多个使用这种方法的 classes,所以通用的方法会很有用)

编辑:

我的实体看起来像这样:

@Entity
@Table(name = "cars")
public class Car extends BaseEntityWithName {

    private String name;

    private String plateNumber;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "owner_id")
    private Owner owner;

}

@Entity
@Table(name = "car_owners")
public class CarOwner extends BaseEntityWithName {

    private String firstName;
    private String lastName;

    // Constructor, setters, getters
}

我正试图在控制器中做这样的事情:

@RestController
@RequestMapping("/cars")
public class CarController {

    @Autowired
    private CarService carService;

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    @ResponseBody
    public ProductModel createItem(Car car) {
        // How do I create the owner using the JSON parameters 
        // provided in the nested JSON?

        car.setOwner(owner); // Owner created above
        return carService.save(car);
    }

}

编辑 2 我的两个服务看起来像这样。两者的结构相同。

@Service
public class CarServiceImpl implements CarService {

    @Autowired
    private ProductManufacturerRepository productManufacturerRepository;

    @Autowired
    private CarRepository carRepository;

    @Override
    public List<Car> findAll() {
        return carRepository.findAll();
    }

    @Override
    public Car findOne(Long id) {
        return carRepository.findOne(id);
    }

    @Override
    @Transactional
    public Car save(Car car) {
        return carRepository.save(car);
    }

    @Override
    public void removeOne(Long id) {
        carRepository.delete(id);
    }
}

从你的服务层我可以看出你只需要保存所有者class。最好是在单独的所有者服务中,但这足以作为开始。

@Service
public class CarServiceImpl implements CarService {

    @Autowired
    private ProductManufacturerRepository productManufacturerRepository;

    @Autowired
    private CarRepository carRepository;

    @Override
    public List<Car> findAll() {
        return carRepository.findAll();
    }

    @Override
    public Car findOne(Long id) {
        return carRepository.findOne(id);
    }

    @Override
    @Transactional
    public Car save(Car car) {
        Owner person = car.getOwner();
        ownerRepository.save(person);
        return carRepository.save(car);
    }

    @Override
    public void removeOne(Long id) {
        carRepository.delete(id);
    }
}