Menggunakan Spring @ResponseStatus untuk Mengatur Kode Status HTTP

1. Perkenalan

Di Spring MVC, kami memiliki banyak cara untuk mengatur kode status respons HTTP .

Dalam tutorial singkat ini, kita akan melihat cara paling mudah: menggunakan anotasi @ResponseStatus .

2. Tentang Metode Pengontrol

Saat titik akhir berhasil dikembalikan, Spring memberikan respons HTTP 200 (OK).

Jika kami ingin menentukan status respons dari metode pengontrol , kami dapat menandai metode itu dengan @ResponseStatus. Ini memiliki dua argumen yang dapat dipertukarkan untuk status respons yang diinginkan: kode, dan nilai. Misalnya, kami dapat menunjukkan bahwa server menolak menyeduh kopi karena ini adalah poci teh:

@ResponseStatus(HttpStatus.I_AM_A_TEAPOT) void teaPot() {}

Ketika kami ingin memberi sinyal kesalahan, kami dapat memberikan pesan kesalahan melalui argumen alasan :

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}

Catatan, saat kita menyetel alasan , Spring memanggil HttpServletResponse.sendError () . Oleh karena itu, ini akan mengirim halaman kesalahan HTML ke klien, yang membuatnya tidak cocok untuk titik akhir REST .

Perhatikan juga, Spring hanya menggunakan @ResponseStatus , jika metode yang ditandai berhasil diselesaikan (tanpa mengeluarkan Exception ).

3. Dengan Penangan Kesalahan

Kami memiliki tiga cara untuk menggunakan @ResponseStatus untuk mengubah Pengecualian menjadi status tanggapan HTTP:

  • menggunakan @ExceptionHandler
  • menggunakan @ControllerAdvice
  • menandai kelas Exception

Untuk menggunakan dua solusi pertama, kita harus mendefinisikan metode penanganan kesalahan. Anda dapat membaca lebih lanjut tentang topik ini di artikel ini.

Kita dapat menggunakan @ResponseStatus dengan metode penanganan kesalahan ini dengan cara yang sama seperti yang kita lakukan dengan metode MVC biasa di bagian sebelumnya.

Ketika kita tidak membutuhkan respons kesalahan dinamis, solusi paling mudah adalah yang ketiga: menandai kelas Exception dengan @ResponseStatus:

@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}

Saat Spring menangkap Pengecualian ini , Spring menggunakan pengaturan yang kami sediakan di @ResponseStatus .

Perhatikan, bahwa ketika kita menandai kelas Exception dengan @ResponseStatus , Spring selalu memanggil HttpServletResponse.sendError () , baik kita menyetel alasan atau tidak.

Perhatikan juga, bahwa Spring menggunakan konfigurasi yang sama untuk subclass, kecuali kita menandainya dengan @ResponseStatus juga.

4. Kesimpulan

Di artikel ini, kami melihat bagaimana kami dapat menggunakan @ResponseStatus untuk menyetel kode respons HTTP dalam berbagai skenario, termasuk penanganan kesalahan.

Seperti biasa, contoh tersedia di GitHub.