Menggunakan Spring @ResponseStatus untuk Menetapkan Kod Status HTTP

1. Pengenalan

Di Spring MVC, kami mempunyai banyak cara untuk menetapkan kod status respons HTTP .

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

2. Mengenai Kaedah Pengawal

Apabila titik akhir kembali berjaya, Spring memberikan respons HTTP 200 (OK).

Sekiranya kita ingin menentukan status tindak balas kaedah pengawal , kita boleh menandakan kaedah itu dengan @ResponseStatus. Ia mempunyai dua argumen yang dapat ditukar untuk status respons yang diinginkan: kod, dan nilai. Sebagai contoh, kami dapat menunjukkan bahawa pelayan enggan membuat kopi kerana ia adalah teko:

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

Apabila kami ingin memberi isyarat kesalahan, kami dapat memberikan mesej ralat melalui argumen alasan :

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

Perhatikan, bahawa apabila kita menetapkan alasan , Spring memanggil HttpServletResponse.sendError () . Oleh itu, ia akan menghantar halaman ralat HTML kepada pelanggan, yang menjadikannya tidak sesuai untuk titik akhir REST .

Perhatikan juga, bahawa Spring hanya menggunakan @ResponseStatus , apabila kaedah yang ditandai selesai dengan jayanya (tanpa membuang Pengecualian ).

3. Dengan Pengendali Ralat

Kami mempunyai tiga cara untuk menggunakan @ResponseStatus untuk menukar Pengecualian ke status respons HTTP:

  • menggunakan @ExceptionHandler
  • menggunakan @ControllerAdvice
  • menandakan kelas Pengecualian

Untuk menggunakan dua penyelesaian pertama, kita harus menentukan kaedah pengendali ralat. Anda boleh membaca lebih lanjut mengenai topik ini dalam artikel ini.

Kita boleh menggunakan @ResponseStatus dengan kaedah pengendali ralat ini dengan cara yang sama seperti kaedah MVC biasa di bahagian sebelumnya.

Apabila kita tidak memerlukan tindak balas ralat dinamik, penyelesaian yang paling mudah adalah yang ketiga: menandakan kelas Pengecualian dengan @ResponseStatus:

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

Ketika Spring menangkap Pengecualian ini , ia menggunakan tetapan yang kami sediakan di @ResponseStatus .

Perhatikan, bahawa ketika kita menandakan kelas Pengecualian dengan @ResponseStatus , Spring selalu memanggil HttpServletResponse.sendError () , sama ada kita menetapkan alasan atau tidak.

Perhatikan juga bahawa Spring menggunakan konfigurasi yang sama untuk subkelas, kecuali kita menandakannya dengan @ResponseStatus juga.

4. Kesimpulan

Dalam artikel ini, kami melihat bagaimana kami dapat menggunakan @ResponseStatus untuk menetapkan kod respons HTTP dalam senario yang berbeza, termasuk pengendalian ralat.

Seperti biasa, contohnya terdapat di GitHub.