@RequestParam di Spring MVC yang menangani parameter opsional

186

Apakah mungkin untuk kontroler Spring untuk menangani kedua jenis permintaan?

1) http://localhost:8080/submit/id/ID123432?logout=true

2) http://localhost:8080/submit/id/ID123432?name=sam&password=543432

Jika saya mendefinisikan satu pengontrol semacam itu:

 @RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout", required = false) String logout,
                              @RequestParam("name") String username,
                              @RequestParam("password") String password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

permintaan HTTP dengan "logout" tidak diterima.

Jika saya mendefinisikan dua kontroler untuk menangani setiap permintaan secara terpisah, Spring mengeluh dengan pengecualian "Sudah ada metode kacang 'Controller' ... dipetakan".

luksmir
sumber
2
Baca artikel ini: codeflex.co/…
ybonda

Jawaban:

224

Anda perlu memberikan required = falseuntuk namedan passwordparameter permintaan juga. Itu karena, ketika Anda memberikan hanya logoutparameter, itu sebenarnya mengharapkan namedan passwordjuga mereka masih wajib.

Itu bekerja ketika Anda baru saja memberi namedan passwordkarena logoutitu bukan parameter wajib terima kasih required = falsesudah diberikan untuk logout.

SudoRahul
sumber
168

Sebagai bagian dari Spring 4.1.1dan seterusnya Anda sekarang memiliki dukungan penuh Java 8 Optional( tiket asli ) karena itu dalam contoh Anda kedua permintaan akan pergi melalui titik akhir pemetaan tunggal Anda selama Anda mengganti required=falsedengan Opsional untuk logout 3 params Anda, nama, kata sandi:

@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,   
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout") Optional<String> logout,
                              @RequestParam("name") Optional<String> username,
                              @RequestParam("password") Optional<String> password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}
dimitrisli
sumber
2
@VibhavChaddha Anda dapat menggunakan sesuatu seperti ini: if (idOfUser.isPresent ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
Cassio Seffrin
10
Peringatan Intellij: 'Opsional <Panjang>' digunakan sebagai jenis untuk parameter 'dimintaTimelineStart' kurang ... (Strg + F1) Info inspeksi: Melaporkan setiap penggunaan java.util. Opsional <T>, java.util.OptionalDouble, java. util.OptionalInt, java.util.OptionalLong atau com.google.common.base.Optional sebagai jenis untuk bidang atau parameter. Opsional dirancang untuk menyediakan mekanisme terbatas untuk tipe pengembalian metode perpustakaan di mana perlu ada cara yang jelas untuk mewakili "tidak ada hasil". Menggunakan bidang dengan tipe java.util.Optional juga bermasalah jika kelas perlu Serializable, yang java.util.Optional tidak.
PeMa
Ini seharusnya jawaban yang benar baru dengan Java 8 saya percaya.
java-addict301
40

Buat 2 metode yang menangani kasus. Anda dapat menginstruksikan @RequestMappinganotasi untuk mempertimbangkan parameter tertentu saat memetakan permintaan. Dengan begitu Anda dapat membagi ini menjadi 2 metode.

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"logout"})
public String handleLogout(@PathVariable("id") String id, 
        @RequestParam("logout") String logout) { ... }

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                 produces="text/xml", params={"name", "password"})
public String handleLogin(@PathVariable("id") String id, @RequestParam("name") 
        String username, @RequestParam("password") String password, 
        @ModelAttribute("submitModel") SubmitModel model, BindingResult errors) 
        throws LoginException {...}
M. Deinum
sumber
1
apa yang akan terjadi ketika seseorang melewati kedua logout, nama dan kata sandi ke URL? Baca saja dokumentasinya, katanya !myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.harus coba.
pembawa cincin
2
Ini akan menemukan kecocokan terbaik, mungkin akan mencoba menggunakan yang handleLoginlain itu akan memberikan pengecualian yang menyatakan tidak ada pemetaan yang dapat ditemukan.
M. Deinum
3
Hanya satu catatan: dari perspektif keamanan logout hanya akan menerima permintaan POST, jadi harus ada 2 metode dan tidak masuk akal untuk menjaga URL mereka tetap sama.
FlasH dari Ru