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のエラーメッセージをフェッチしてラップするだけです。
個人的には、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"
}