Saya belajar JAX-RS (alias, JSR-311) menggunakan Jersey. Saya telah berhasil membuat Sumber Daya Root dan bermain-main dengan parameter:
@Path("/hello")
public class HelloWorldResource {
@GET
@Produces("text/html")
public String get(
@QueryParam("name") String name,
@QueryParam("birthDate") Date birthDate) {
// Return a greeting with the name and age
}
}
Ini berfungsi dengan baik, dan menangani format apa pun di lokal saat ini yang dipahami oleh konstruktor Date (String) (seperti YYYY / mm / dd dan mm / dd / YYYY). Tetapi jika saya memberikan nilai yang tidak valid atau tidak dipahami, saya mendapatkan respons 404.
Sebagai contoh:
GET /hello?name=Mark&birthDate=X
404 Not Found
Bagaimana saya bisa menyesuaikan perilaku ini? Mungkin kode respons yang berbeda (mungkin "400 Permintaan Buruk")? Bagaimana dengan mencatat kesalahan? Mungkin menambahkan deskripsi masalah ("format tanggal buruk") di header khusus untuk membantu pemecahan masalah? Atau kembalikan respons Kesalahan lengkap dengan detail, bersama dengan kode status 5xx?
ExceptionMapper
antarmuka (yang merupakan pendekatan yang lebih baik kemudian memperluas). Lihat lebih lanjut di sini vvirlan.wordpress.com/2015/10/19/…Buat kelas di atas. Ini akan menangani 404 (NotFoundException) dan di sini di metode toResponse Anda dapat memberikan respons khusus. Demikian pula ada ParamException dll. Yang perlu Anda petakan untuk memberikan tanggapan yang disesuaikan.
sumber
Jersey melempar com.sun.jersey.api.ParamException ketika gagal menghapus parameter, jadi salah satu solusinya adalah membuat ExceptionMapper yang menangani jenis pengecualian ini:
sumber
Anda juga bisa menulis kelas yang dapat digunakan kembali untuk variabel beranotasi QueryParam
lalu gunakan seperti ini:
Meskipun penanganan kesalahannya sepele dalam kasus ini (melemparkan respons 400), menggunakan kelas ini memungkinkan Anda untuk memperhitungkan faktor penanganan parameter secara umum yang mungkin termasuk pencatatan, dll.
sumber
DateParam
atas yang membungkusorg.joda.time.DateTime
bukanjava.util.Calendar
. Anda menggunakannya dengan@QueryParam
bukanDateTime
dirinya sendiri.JodaModule
yang dapat didaftarkan denganObjectMapper
registerModules
metode ini. Itu dapat menangani semua konversi jenis joda.com.fasterxml.jackson.datatype.joda.JodaModule
Satu solusi yang jelas: ambil dalam sebuah String, konversikan ke Date yourself. Dengan begitu Anda dapat menentukan format yang Anda inginkan, menangkap pengecualian dan melempar ulang atau menyesuaikan kesalahan yang sedang dikirim. Untuk parsing, SimpleDateFormat seharusnya berfungsi dengan baik.
Saya yakin ada cara untuk mengaitkan penangan untuk tipe data juga, tetapi mungkin sedikit kode sederhana adalah semua yang Anda butuhkan dalam kasus ini.
sumber
Saya juga suka StaxMan mungkin akan mengimplementasikan QueryParam itu sebagai sebuah String, kemudian menangani konversi, rethrowing seperlunya.
Jika perilaku spesifik lokal adalah perilaku yang diinginkan dan diharapkan, Anda akan menggunakan yang berikut ini untuk mengembalikan kesalahan 400 BAD REQUEST:
throw new WebApplicationException(Response.Status.BAD_REQUEST);
Lihat JavaDoc untuk javax.ws.rs.core.Response.Status untuk opsi lebih lanjut.
sumber
Dokumentasi @QueryParam berkata
Jika Anda ingin mengontrol respons apa yang masuk ke pengguna ketika parameter kueri dalam bentuk String tidak dapat dikonversi ke tipe T Anda, Anda bisa melempar WebApplicationException. Dropwizard hadir dengan kelas * Param berikut yang dapat Anda gunakan untuk kebutuhan Anda.
BooleanParam, DateTimeParam, IntParam, LongParam, LocalDateParam, NonEmptyStringParam, UUIDParam. Lihat https://github.com/dropwizard/dropwizard/tree/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/params
Jika Anda membutuhkan Joda DateTime, cukup gunakan Dropwizard DateTimeParam .
Jika daftar di atas tidak sesuai dengan kebutuhan Anda, tentukan sendiri dengan memperluas AbstractParam. Ganti metode parse. Jika Anda perlu mengontrol badan respons kesalahan, ganti metode kesalahan.
Artikel bagus dari Coda Hale tentang ini ada di http://codahale.com/what-makes-jersey-interesting-parameter-classes/
Tanggal (String arg) konstruktor sudah usang. Saya akan menggunakan kelas tanggal Java 8 jika Anda berada di Jawa 8. Jika tidak, tanggal joda disarankan.
sumber
Ini sebenarnya perilaku yang benar. Jersey akan mencoba menemukan penangan untuk input Anda dan akan mencoba untuk membangun objek dari input yang disediakan. Dalam hal ini akan mencoba untuk membuat objek Date baru dengan nilai X yang diberikan kepada konstruktor. Karena ini adalah tanggal yang tidak valid, dengan konvensi Jersey akan mengembalikan 404.
Apa yang dapat Anda lakukan adalah menulis ulang dan menempatkan tanggal lahir sebagai sebuah String, kemudian mencoba untuk menguraikan dan jika Anda tidak mendapatkan apa yang Anda inginkan, Anda bebas untuk membuang pengecualian yang Anda inginkan dengan salah satu mekanisme pemetaan pengecualian (ada beberapa ).
sumber
Saya menghadapi masalah yang sama.
Saya ingin menangkap semua kesalahan di tempat sentral dan mengubahnya.
Berikut ini adalah kode untuk bagaimana saya menanganinya.
Buat kelas berikut yang mengimplementasikan
ExceptionMapper
dan menambahkan@Provider
anotasi pada kelas ini. Ini akan menangani semua pengecualian.Ganti
toResponse
metode dan kembalikan objek Respons yang diisi dengan data khusus.sumber
Pendekatan 1: Dengan memperluas kelas WebApplicationException
Buat pengecualian baru dengan memperluas WebApplicationException
Sekarang lempar 'RestException' kapan pun diperlukan.
Anda dapat melihat aplikasi lengkap di tautan ini .
Pendekatan 2: Terapkan ExceptionMapper
Mapper berikut menangani pengecualian tipe 'DataNotFoundException'
Anda dapat melihat aplikasi lengkap di tautan ini .
sumber
Sama seperti ekstensi ke @Steven Lavine jika Anda ingin membuka jendela login browser. Saya merasa sulit untuk mengembalikan Respons ( MDN HTTP Authentication ) dengan benar dari Filter jika pengguna belum diautentikasi
Ini membantu saya untuk membangun Respons untuk memaksa masuk browser, perhatikan modifikasi tambahan dari header. Ini akan mengatur kode status ke 401 dan mengatur header yang menyebabkan browser membuka dialog nama pengguna / kata sandi.
sumber