2017-05-19 27 views
0

Spring Boot and RestControllerを使用してネストされたJSONをデータベースに保存しようとしています。 RestControllerに春が提供する自動マッピングを使用して、通常のフィールド(名前とプレート番号)にマッピングするのは簡単だったRestControllerでネストされたJSONをマップするにはどうすればよいですか?

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

public Car createProduct(Car car) { 

} 

をしかし、今、どのようにこれらのJSONsは次のようになり私はCarOwner、それ自身のクラスにオブジェクトの所有者をマップすることができます(私はそう一般的な方法は非常に有用であろう。このアプローチを使用して複数のクラスを持っていることを言及する必要があります)

EDIT:?

私のエンティティは次のようになります。

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

そして私は、コントローラにこのような何かをしようとしている:2 私の2つのサービスは、次のようになり

@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。構造は両者で同じです。

@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だったが、どうしたのが正しいのか分からない。私は、このWebサイト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

解決済み。私のクラスは正しく構成されていませんでした。

関連する問題