2017-05-19 43 views
0

我試圖使用Spring Boot和RestController在數據庫中保存嵌套的JSON。這些JSONs是這個樣子:如何在RestController中映射嵌套的JSON?

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

這是很容易映射利用春天的RestController提供的自動映射正常的字段(姓名和車牌號碼):

public Car createProduct(Car car) { 

} 

但現在,如何可我對象所有者映射到它自己的類,CarOwner(我需要提及的是我有一個使用這種方法,使一個通用的方法是非常有用的多類)

編輯:

我的實體是這樣的:

@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); 
    } 

} 

EDIT 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); 
    } 
} 
+0

您的JSON文件格式不正確。請先更新您預期的JSON模式。 –

+0

@DoNhuVy這是我從前端發送的確切的json,我不明白這是不正確的。我已經更新了一個基於這個網站的工作之一http://codebeautify.org/jsonviewer –

回答

0

從你的服務層我可以看到你只需要保存所有者類。最好這將在一個單獨的業主服務,但這是足夠好的一開始。

@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); 
    } 
} 
+0

我已經有了這些,我已經更新了我的職位類代碼和控制器。 –

+0

我總是建議分離實體和DTO。因爲他們有不同的要求,請閱讀更多http://stackoverflow.com/a/43823840/2433323 –

+0

@IonuţZamfir你可以發佈你的服務層嗎? –

0

解決了這個問題。我的課沒有正確配置。