it-swarm.com.de

@RequestParam in Spring MVC behandelt optionale Parameter

Kann ein Spring-Controller beide Arten von Anfragen bearbeiten?

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

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

Wenn ich einen einzelnen Controller der Art definiere:

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

die HTTP-Anfrage mit "Logout" wird nicht akzeptiert.

Wenn ich zwei Controller definiere, um jede Anforderung separat zu behandeln, beschwert sich Spring mit der Ausnahme "Es ist bereits eine Controller-Bean-Methode zugeordnet".

160
luksmir

Sie müssen required = false auch für name und password Anforderungsparameter angeben. Wenn Sie nur den Parameter logout angeben, werden tatsächlich name und password erwartet, und sie sind weiterhin obligatorisch.

Es hat funktioniert, als Sie gerade name und password angegeben haben, da logout dank required = false, das bereits für logout angegeben wurde, kein obligatorischer Parameter war.

200
SudoRahul

Als Teil von Spring 4.1.1 haben Sie nun die volle Unterstützung von Java 8 Optional ( Originalticket ), daher werden in Ihrem Beispiel beide Anfragen über Ihre Single bearbeitet Mapping-Endpunkt, solange Sie required=false durch Optional für Ihre 3 Parameter Logout, Name, Passwort ersetzen:

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

Erstellen Sie 2 Methoden, die die Fälle behandeln. Sie können die Annotation @RequestMapping anweisen, bestimmte Parameter beim Zuordnen der Anforderung zu berücksichtigen. Auf diese Weise können Sie dies in 2 Methoden aufteilen.

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