@RequestParam Bahar MVC isteğe bağlı parametreleri işleme


186

Bir Spring kontrolörünün her iki talebi de ele alması mümkün müdür?

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

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

Tür tek bir denetleyici tanımlarsanız:

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

"oturumu kapat" özelliğine sahip HTTP isteği kabul edilmez.

Her isteği ayrı ayrı ele almak için iki denetleyici tanımlarsam, Spring "Zaten" Denetleyici "fasulye yöntemi var ... eşlendi" dışında şikayet eder.


2
Bu makaleyi okuyun: codeflex.co/…
ybonda

Yanıtlar:


224

Sen vermek gerekir required = falseiçin nameve passwordistek parametreleri de. Çünkü, sadece logoutparametreyi sağladığınızda , aslında zorunludur nameve passwordaynı zamanda zorunludur.

Sadece verince İşe yaradı nameve passwordçünkü logoutzorunlu bir parametre sayesinde değildi required = falsezaten verilen logout.


168

Daha sonra bir parçası olarak Spring 4.1.1artık Java 8 Optional( orijinal bilet ) tam desteğine sahipsiniz, bu nedenle örneğinizde, her iki istek de required=false3 params oturum kapatma, ad, parola için İsteğe bağlı ile değiştirdiğiniz sürece tek eşleme uç noktanızdan geçecektir :

@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 şöyle bir şey kullanabilirsiniz: if (idOfUser.isPresent ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
Cassio Seffrin

10
Intellij uyarısı: 'requestedTimelineStart' parametresi için tür olarak kullanılan 'İsteğe bağlı <Uzun>' daha az ... (Strg + F1) Denetim bilgisi: java.util.Optional <T>, java.util.OptionalDouble, java'nın tüm kullanımlarını bildirir. Bir alanın veya parametrenin türü olarak util.OptionalInt, java.util.OptionalLong veya com.google.common.base.Optional. İsteğe bağlı, "sonuç yok" un temsil edilmesi için açık bir yol olması gereken kütüphane yöntemi dönüş türleri için sınırlı bir mekanizma sağlamak üzere tasarlanmıştır. Sınıfın Serializable olması gerekirse java.util.Optional türünde bir alan kullanmak da sorunludur; java.util.Optional değildir.
PeMa

Bu inanıyorum Java 8 ile yeni doğru cevap olmalı.
java-addict301

40

Vakaları ele alan 2 yöntem oluşturun. Sen talimat verebilirsiniz @RequestMappingisteği haritalama ederken hesap belirli parametrelere almaya ek açıklama. Bu şekilde bunu 2 yönteme ayırabilirsiniz.

@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
birisi URL'ye hem oturum kapatma, ad hem de şifre gönderdiğinde ne olur? Sadece belgeleri okuyun, !myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.denemek lazım diyor .
halka taşıyıcı

2
En iyi eşleşmeyi bulacak, muhtemelen handleLoginbaşka bir eşleşme bulunmayacağını belirten bir istisna verecek kullanmaya çalışacaktır .
M.Deinum

3
Sadece bir not: güvenlik açısından çıkış sadece POST isteklerini kabul etmelidir, 2 yöntem olmalı ve URL'lerini aynı tutmak mantıklı değildir.
FlasH kimden Ru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.