4

Spring MVC と Spring Data を使用して REST API に取り組んでいます。

基本的に自動生成されたデータ (ID、更新日、作成日) を持ついくつかのエンティティを REST で公開しています。

public class Batch implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "hibernate_sequence")
    private Integer id;

    @Column(name = "create_date")
    private Date createDate;

    @Column(name = "update_date")
    private Date updateDate;

    // Getters/Setters for these fields
}

リクエストを処理するためのコントローラーのセットアップ方法は次のとおりです

@RequestMapping(value = "recipe/{id}/batch", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Batch> createBatch(@PathVariable Integer id, @RequestBody Batch batch)
{
    batch.setRecipeId(id);
    Batch in = batchService.createBatch(batch);

    return new ResponseEntity<Batch>(in, HttpStatus.CREATED);
}

@RequestMapping(value = "recipe/{id}/batch/{batchId}", method = RequestMethod.PUT)
@ResponseBody
public ResponseEntity<Batch> updateBatch(@PathVariable Integer id, @PathVariable Integer batchId, @RequestBody Batch batch)
{
    Batch existing = batchService.getBatch(batchId);
    batch.setId(batchId);
    batch.setRecipeId(id);
    batch.setCreateDate(existing.getCreateDate());

    Batch in = batchService.saveBatch(batch);

    return new ResponseEntity<Batch>(in, HttpStatus.OK);
}

次に、最後にバッチ サービス public Batch createBatch(Batch batch) { Batch saved = batchRepository.save(batch); 保存されたリターン。}

public Batch saveBatch(Batch batch)
{
    return batchRepository.save(batch);
}

これらのフィールドを処理するサービスにフィードするときに、これらのフィールドが更新されないようにするにはどうすればよいでしょうか? REST から PUT/POST されたバージョンからサービスに手動でコピーする必要がありますか、API からこれらのフィールドのデータを除外するより良い方法があります。約 15 の異なるリソースがある場合、それらを手動でコピーするのも非常に面倒に思えます。

ユーザーがリソースに対して GET を実行したときにそれらを表示したいのですが、提供する値が必要ないだけですが、これを管理する方法の良い例を実際に見つけることができません。

4

2 に答える 2

3

既存の値を上書きしないように、create_date や id などのフィールドを「更新不可」としてマークする必要があります。

    @Column(name = "create_date", insertable = true, updatable = false)
于 2013-08-14T08:17:45.277 に答える
0

コードでは、既存のバッチをマージする代わりに、新しいバッチを保存します。これが、生成された ID の問題の原因です。基本的に、関連する既存のエンティティの関連フィールドを更新し、マージされる更新された既存のエンティティを保存する必要があります。あなたの変更。

醜いですが、これ以上エレガントなものはまだ見たことがありません。

于 2013-08-14T07:30:50.303 に答える