@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".


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.


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 {...}

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 {...}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.