Bagaimana cara mendapatkan musim semi pengontrol 3.0 untuk memicu 404?
Saya memiliki pengontrol dengan @RequestMapping(value = "/**", method = RequestMethod.GET)
dan untuk beberapa URL mengakses pengontrol, saya ingin wadah muncul dengan 404.
java
spring
spring-mvc
NA.
sumber
sumber
@ResponseStatus
adalah bahwa Anda mendefinisikan sejumlah besar kelas pengecualian yang diketik dengan baik, masing-masing dengan kelasnya sendiri@ResponseStatus
. Dengan begitu, Anda memisahkan kode pengontrol dari detail kode status HTTP.@ResponseStatus(value = HttpStatus.NOT_FOUND, reason="Your reason")
ResourceNotFound.fillInStackTrace()
dengan implementasi kosong.Mulai dari Spring 5.0, Anda tidak perlu membuat pengecualian tambahan:
Selain itu, Anda dapat membahas beberapa skenario dengan satu, pengecualian bawaan dan Anda memiliki kontrol lebih.
Lihat lebih lanjut:
sumber
Tulis ulang tanda tangan metode Anda sehingga diterima
HttpServletResponse
sebagai parameter, sehingga Anda dapat meneleponsetStatus(int)
.http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments
sumber
setStatus(int)
javadoc menyatakan sebagai berikut: Jika metode ini digunakan untuk mengatur kode kesalahan, maka mekanisme halaman kesalahan penampung tidak akan dipicu. Jika ada kesalahan dan penelepon ingin meminta halaman kesalahan yang ditentukan dalam aplikasi web, makasendError
harus digunakan sebagai gantinya.Saya ingin menyebutkan bahwa ada pengecualian (tidak hanya) untuk 404 secara default disediakan oleh Spring. Lihat dokumentasi Spring untuk detailnya. Jadi, jika Anda tidak membutuhkan pengecualian Anda sendiri, Anda bisa melakukan ini:
sumber
@PathVariable
tidak ada penanganan permintaan dari sudut pandang saya. Apakah menurut Anda lebih baik / bersih menggunakan Pengecualian Anda sendiri yang dijelaskan dengan@ResponseStatus(value = HttpStatus.NOT_FOUND)
?Sejak Spring 3.0.2 Anda dapat mengembalikan ResponseEntity <T> sebagai hasil dari metode pengontrol:
(ResponseEntity <T> lebih fleksibel daripada penjelasan @ResponseBody - lihat pertanyaan lain )
sumber
Anda dapat menggunakan @ControllerAdvice untuk menangani Pengecualian Anda, Perilaku default kelas penjelasan @ControllerAdvice akan membantu semua Pengendali yang dikenal.
sehingga akan dipanggil ketika Kontroler yang Anda miliki memiliki 404 kesalahan.
seperti berikut ini:
dan petakan kesalahan respons 404 ini di web.xml Anda, seperti berikut ini:
Semoga Itu Membantu.
sumber
Jika metode pengontrol Anda untuk sesuatu seperti penanganan file maka
ResponseEntity
sangat berguna:sumber
Meskipun jawaban yang ditandai sudah benar, ada cara untuk mencapainya tanpa kecuali. Layanan ini mengembalikan
Optional<T>
objek yang dicari dan ini dipetakan keHttpStatus.OK
jika ditemukan dan ke 404 jika kosong.sumber
Saya sarankan untuk melempar HttpClientErrorException , seperti ini
Anda harus ingat bahwa ini dapat dilakukan hanya sebelum sesuatu ditulis ke servlet output stream.
sumber
Whitelabel Error Page \n .... \n There was an unexpected error (type=Internal Server Error, status=500). \n 404 This is your not found error
Ini agak terlambat, tetapi jika Anda menggunakan Spring Data REST maka sudah ada
org.springframework.data.rest.webmvc.ResourceNotFoundException
Ini juga menggunakan@ResponseStatus
anotasi. Tidak perlu lagi membuat pengecualian runtime khusus.sumber
Juga jika Anda ingin mengembalikan status 404 dari pengontrol Anda, Anda hanya perlu melakukan ini
Dengan melakukan ini, Anda akan menerima kesalahan 404 jika Anda ingin mengembalikan 404 dari controller Anda.
sumber
Cukup Anda dapat menggunakan web.xml untuk menambahkan kode kesalahan dan 404 halaman kesalahan. Tetapi pastikan halaman kesalahan 404 tidak boleh ditemukan di bawah WEB-INF.
Ini adalah cara paling sederhana untuk melakukannya tetapi ini memiliki beberapa keterbatasan. Misalkan jika Anda ingin menambahkan gaya yang sama untuk halaman ini yang Anda tambahkan halaman lain. Dengan cara ini Anda tidak bisa melakukan itu. Anda harus menggunakan
@ResponseStatus(value = HttpStatus.NOT_FOUND)
sumber
HttpServletResponse#sendError(HttpServletResponse.SC_NOT_FOUND); return null;
dari kode pengontrol. Sekarang dari luar responnya tidak berbeda dengan 404 normal yang tidak mengenai controller apa pun.Konfigurasikan web.xml dengan pengaturan
Buat pengontrol baru
sumber
Karena itu selalu baik untuk memiliki setidaknya sepuluh cara melakukan hal yang sama:
sumber