Apakah mungkin untuk menggunakan nilai RequestParam kosong menggunakan defaultValue?

120

jika saya memiliki pemetaan permintaan yang mirip dengan berikut ini:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

Dan kemudian panggil permintaan ini dengan:

http://example.com/test?i=

Saya mendapatkan pesan kesalahan

Gagal mengonversi nilai tipe 'java.lang.String' ke tipe 'int'; pengecualian bersarang adalah java.lang.NumberFormatException: Untuk input string: "" '

Saya dapat menyelesaikan ini dengan menghentikan klien javascript agar tidak mengirimkan parameter kosong, atau dengan menerima nilai string dan hanya mem-parsing jika tidak ditemukan kosong.

PEMBARUAN : Versi pegas yang lebih baru sekarang menerapkan perilaku yang awalnya diinginkan.

Saya baru saja menguji ini di musim semi 4.3.5 dan telah menemukan bahwa perilaku sekarang sebenarnya akan mengubah nilai nol menjadi nilai default tanpa menaikkan NumberFormatException, jadi; pemetaan asli saya sekarang berfungsi dengan baik.

Saya tidak yakin versi musim semi yang mana perubahan perilaku ini dibuat.

Brett Ryan
sumber
pasti parameternya akan menjadi tipe Integer untuk meningkatkan pengecualian itu?
laher
3
im bukan ahli musim semi, tetapi apakah nilai default digunakan saat Anda tidak menyetelnya? yaitu apakah permintaan Anda akan menjadi example.com/test ? saat Anda menggunakan example.com/test?i= maka saya ada dan disetel ke "" jadi nilai default tidak digunakan
user902383
Terima kasih amir75, Stringtipe tidak sengaja diberikan . user902383, itu benar, meskipun untuk nilai integer saya lebih suka nilai null / kosong akan menggunakan defaultValue sebagai gantinya.
Brett Ryan

Jawaban:

175

Anda dapat mengubah jenis @RequestParam menjadi Integer dan membuatnya tidak diperlukan. Ini akan memungkinkan permintaan Anda berhasil, tetapi kemudian akan menjadi nol. Anda dapat secara eksplisit mengaturnya ke nilai default Anda di metode pengontrol:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

Saya telah menghapus defaultValue dari contoh di atas, tetapi Anda mungkin ingin memasukkannya jika Anda ingin menerima permintaan yang tidak disetel sama sekali:

http://example.com/test
Matt
sumber
6
Hanya pembaruan tentang ini, versi pegas terbaru sebenarnya tidak lagi memerlukan pemeriksaan nol karena perilaku yang diinginkan telah disertakan dengan pegas bahwa nilai kosong akan menghasilkan nilai default yang digunakan.
Brett Ryan
3
Jawaban usang, solusi terbaik adalah dari @AppLend
Jose Pose S
101

Anda dapat mempertahankan tipe primitif dengan menyetel nilai default, dalam kasus Anda cukup tambahkan properti "required = false" :

@RequestParam(value = "i", required = false, defaultValue = "10") int i

PS Halaman ini dari dokumentasi Spring mungkin berguna: Annotation Type RequestParam

AppLend
sumber
1
Terima kasih, tetapi Anda melewatkan inti pertanyaan saya yang ada di judul. Saya telah meminta kemampuan untuk memasok parameter kosong /test?i=dan karena ikosong memiliki nilai default.
Brett Ryan
5
Bagaimanapun, ketika defaultValuedisediakan, required == falsesecara implisit
Timur Milovanov
4
Jika param disediakan tetapi kosong defaultValuetidak akan berpengaruh.
Brett Ryan
12

Anda dapat mengatur RequestParam, menggunakan integer kelas generik alih-alih int, ini akan menyelesaikan masalah Anda.

   @RequestParam(value= "i", defaultValue = "20") Integer i
Anand Tagore
sumber
1

Anda juga dapat melakukan sesuatu seperti ini -

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i
Tisha
sumber
3
Jika Anda memiliki defaultValue, Anda tidak perlu menjadikannya Opsional.
Kevin M
1

Ini dianggap bug pada 2013: https://jira.spring.io/browse/SPR-10180

dan telah diperbaiki dengan versi 3.2.2. Masalah seharusnya tidak terjadi di versi apa pun setelah itu dan kode Anda seharusnya berfungsi dengan baik.

eis
sumber