@ RequestParam dans Spring MVC gestion des paramètres optionnels

Est-il possible pour un contrôleur spring de gérer les deux types de requêtes?

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

Si je définis un seul contrôleur du genre:

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

La requête HTTP avec "déconnexion" n'est pas acceptée.

Si je définis deux contrôleurs pour gérer chaque requête séparément, Spring se plaint à l'exception "il existe déjà une méthode de bean 'Controller'... mapper".

120
demandé sur Ashot Karakhanyan 2014-03-13 13:05:34

3 réponses

Vous devez également donner required = false pour les paramètres de requête name et password. En effet, lorsque vous fournissez uniquement le paramètre logout, il s'attend en fait à ce que name et password soient toujours obligatoires.

Cela a fonctionné quand vous venez de donner name et password parce que logout n'était pas un paramètre obligatoire grâce à required = false déjà donné pour logout.

153
répondu SudoRahul 2014-03-13 09:53:38

Dans le cadre de Spring 4.1.1 vous avez maintenant un support complet de Java 8 Optional (ticket original ) par conséquent, dans votre exemple, les deux requêtes passeront par votre point de terminaison de mappage unique tant que vous remplacez required=false par optionnel pour vos 3 paramètres logout, name, password:

@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 {...}
101
répondu dimitrisli 2016-11-15 23:52:41

Créez 2 méthodes qui gèrent les cas. Vous pouvez demander à l'annotation @RequestMapping de prendre en compte certains paramètres lors du mappage de la requête. De cette façon, vous pouvez bien diviser cela en 2 méthodes.

@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 {...}
32
répondu M. Deinum 2016-05-16 14:30:57