Di bawah ini adalah potongan kode; pada dasarnya, saya mencoba menyebarkan pengecualian ketika kode kesalahan adalah selain 200.
ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version),
HttpMethod.POST, entity, Object.class);
if(response.getStatusCode().value()!= 200){
logger.debug("Encountered Error while Calling API");
throw new ApplicationException();
}
Namun dalam kasus respon 500 dari server saya mendapatkan pengecualian
org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
Apakah saya benar-benar perlu membungkus metode pertukaran template lainnya dalam percobaan? Lalu, apa tujuan kode?
spring
rest
exception-handling
resttemplate
vaibhav.dll
sumber
sumber
Jawaban:
Anda ingin membuat kelas yang mengimplementasikan
ResponseErrorHandler
dan kemudian menggunakan sebuah instance untuk mengatur penanganan kesalahan dari template lainnya:Selain itu, Spring memiliki kelas
DefaultResponseErrorHandler
, yang dapat Anda perluas alih-alih mengimplementasikan antarmuka, jika Anda hanya ingin menggantihandleError
metode.Lihatlah kode sumbernya untuk mendapatkan gambaran tentang bagaimana Spring menangani kesalahan HTTP.
sumber
ResourceAccessException
karenaRestTemplate.doExecute
menangkapIOException
dan melemparResourceAccessException
. Apa yang saya lakukan salah?Anda harus menangkap
HttpStatusCodeException
pengecualian:sumber
Spring dengan cerdik memperlakukan kode kesalahan http sebagai pengecualian, dan mengasumsikan bahwa kode penanganan pengecualian Anda memiliki konteks untuk menangani kesalahan tersebut. Agar pertukaran berfungsi seperti yang Anda harapkan, lakukan ini:
Ini akan mengembalikan semua hasil yang diharapkan dari respons.
sumber
Solusi lain adalah yang dijelaskan di sini di akhir posting ini oleh "enlian": http://springinpractice.com/2013/10/07/handling-json-error-object-responses-with-springs-resttemplate
sumber
Spring memisahkan Anda dari daftar kode status http yang sangat besar. Itulah gagasan tentang pengecualian. Lihat hierarki org.springframework.web.client.RestClientException:
Anda memiliki banyak kelas untuk memetakan situasi paling umum saat menangani tanggapan http. Daftar kode http sangat besar, Anda tidak ingin menulis kode untuk menangani setiap situasi. Tapi misalnya, lihat sub-hierarki HttpClientErrorException. Anda memiliki satu pengecualian untuk memetakan semua jenis kesalahan 4xx. Jika Anda perlu mendalami, maka Anda bisa. Namun hanya dengan menangkap HttpClientErrorException, Anda dapat menangani situasi apa pun saat data buruk diberikan ke layanan.
DefaultResponseErrorHandler sangat sederhana dan solid. Jika kode status respons bukan dari keluarga 2xx, itu hanya mengembalikan true untuk metode hasError.
sumber
Jika Anda menggunakan mekanisme pooling (http client factory) atau load balancing (eureka) dengan Anda
RestTemplate
, Anda tidak akan memiliki kemewahan membuatnew RestTemplate
per kelas. Jika Anda memanggil lebih dari satu layanan, Anda tidak dapat menggunakansetErrorHandler
karena jika akan digunakan secara global untuk semua permintaan Anda.Dalam hal ini, menangkap
HttpStatusCodeException
nampaknya merupakan pilihan yang lebih baik.Satu-satunya pilihan lain yang Anda miliki adalah menentukan beberapa
RestTemplate
contoh menggunakan@Qualifier
anotasi.Juga - tetapi ini adalah selera saya sendiri - saya suka penanganan kesalahan saya meringkuk erat ke panggilan saya.
sumber
Saya telah menangani ini seperti di bawah ini:
sumber
Kode pertukarannya di bawah ini :
Pengecualian
RestClientException
memilikiHttpClientErrorException
danHttpStatusCodeException
pengecualian.Jadi di
RestTemplete
sana mungkin terjadiHttpClientErrorException
danHttpStatusCodeException
pengecualian. Dalam objek pengecualian Anda bisa mendapatkan pesan kesalahan yang tepat menggunakan cara ini:exception.getResponseBodyAsString()
Berikut ini contoh kode :
Berikut adalah deskripsi kodenya :
Dalam metode ini Anda harus melewati kelas permintaan dan respons. Metode ini akan secara otomatis mengurai respons sebagai objek yang diminta.
Pertama-tama Anda harus menambahkan konverter pesan.
Kemudian Anda harus menambahkan
requestHeader
. Ini kodenya:Akhirnya, Anda harus memanggil metode pertukaran:
Untuk pencetakan prety saya menggunakan perpustakaan Gson. ini gradle:
compile 'com.google.code.gson:gson:2.4'
Anda bisa memanggil kode di bawah ini untuk mendapatkan respon:
Ini kode lengkapnya :
Terima kasih :)
sumber
Solusi yang sangat sederhana dapat berupa:
sumber
Berikut adalah metode POST saya dengan HTTPS yang mengembalikan isi respons untuk semua jenis respons buruk.
sumber