web-dev-qa-db-ja.com

春のブートでREST応答を送信する最良の方法

Spring BootでREST応答を送信するための最良の方法は何ですか?また、それを適切に行うには、ステータスコードの送信をどのように管理する必要がありますか?

現在、私はResponseEntityを使用してそれを行っていますが、これが最もエレガントな方法ではないかと思います。

サンプルコード:

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return new ResponseEntity<>(new ModelErrors(bindingResult), HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(itemService.addItem(item), HttpStatus.CREATED);
}

ModelErrorsクラスはHashMapクラスを拡張し、BindingResultのエラーメッセージをフェッチしてラップするだけです。

4
dudinii

個人的には、ResponseEntityを返すことが多くの場合に最良の選択になると思います。私の意見では、もう少し読みやすい方法は、次のようにResponseEntityで便利なステータスメソッドを使用することです。

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return ResponseEntity.badRequest().body(new ModelErrors(bindingResult));
    }

    return ResponseEntity.created().body(itemService.addItem(item));
}

または、statusメソッドを使用してHttpStatusまたは次のようなステータスコードを渡すこともできます

ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ModelErrors(bindingResult));
ResponseEntity.status(201).body(itemService.addItem(item));

もう1つのオプションは、ResponseEntityを使用せずに必要なタイプを返すことですが、これにより応答の制御が大幅に低下し、適切なMessageConverter構成が必要になります(その上に ここ )。

簡単な例は次のようになります

@RequestMapping("/hotdog")
public Hotdog hotdog() {
    return new Hotdog("mystery meat", "ketchup, mustard");
}

そして、すべてが正しく構成されている場合は、次のような応答になります

{
    "content": "mystery meat",
    "condiments": "ketchup, mustard"
}
9
zero01alpha