The HttpMediaTypeNotAcceptableException di Spring MVC

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan melihat pengecualian HttpMediaTypeNotAcceptableException , dan memahami kes-kes di mana kita mungkin menghadapinya.

2. Masalahnya

Apabila melaksanakan titik akhir API dengan Spring, kita biasanya perlu untuk menentukan / jenis media yang dihasilkan digunakan (melalui consumes dan menghasilkan parameter). Ini menyempitkan kemungkinan format bahawa API akan kembali kepada klien untuk operasi tertentu itu.

HTTP juga mempunyai tajuk "Terima" khusus - yang digunakan untuk menentukan jenis media yang dikenali dan boleh diterima oleh klien. Ringkasnya, pelayan akan menghantar kembali representasi sumber menggunakan salah satu jenis media yang diminta pelanggan.

Namun, jika tidak ada jenis umum yang dapat digunakan oleh kedua belah pihak, Spring akan membuang pengecualian HttpMediaTypeNotAcceptableException .

3. Contoh Praktikal

Mari buat contoh mudah yang akan menunjukkan senario ini.

Kami akan menggunakan titik akhir POST - yang hanya dapat berfungsi dengan "application / json " dan mengembalikan data JSON juga:

@PostMapping( value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public Map example() { return Collections.singletonMap("key", "value"); }

Kemudian, mari kirim permintaan menggunakan CURL dengan jenis kandungan yang tidak dikenali:

curl -X POST --header "Accept: application/pdf" //localhost:8080/test -v > POST /test HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.51.0 > Accept: application/pdf

Sambutan yang kami dapat ialah:

< HTTP/1.1 406 < Content-Length: 0

4. Penyelesaiannya

Hanya ada satu cara untuk menyelesaikan masalah - untuk menghantar / menerima salah satu jenis yang disokong.

Yang boleh kami lakukan hanyalah memberikan mesej yang lebih deskriptif (secara default Spring mengembalikan badan kosong) dengan ExceptionHandler tersuai yang memberitahu pelanggan mengenai semua jenis media yang boleh diterima.

Dalam kes kami, hanya "application / json" :

@ResponseBody @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public String handleHttpMediaTypeNotAcceptableException() { return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE; }

5. Kesimpulan

Dalam tutorial ini, kami telah mempertimbangkan pengecualian HttpMediaTypeNotAcceptableException yang dilontarkan oleh Spring MVC apabila terdapat ketidakcocokan antara apa yang diminta oleh pelanggan dan apa yang sebenarnya dapat dihasilkan oleh pelayan.

Seperti biasa, coretan kod yang disebutkan dalam artikel boleh didapati di repositori GitHub kami.