@RequestParam en primavera MVC manejo de parámetros opcionales


¿Es posible que un controlador de resorte maneje ambos tipos de solicitudes?

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

Si defino un solo controlador del tipo:

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

No se acepta la solicitud HTTP con "logout".

Si defino dos controladores para manejar cada solicitud por separado, Spring se queja con la excepción de "Ya existe el método bean 'Controller'... asignar".

Author: Ashot Karakhanyan, 2014-03-13

3 answers

Usted necesita dar required = false para name y password parámetros de solicitud también. Esto se debe a que, cuando se proporciona solo el parámetro logout, en realidad se espera para name y password, así como que todavía son obligatorios.

Funcionó cuando acabas de dar name y password porque logout no era un parámetro obligatorio gracias a required = false ya dado para logout.

 153
Author: SudoRahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 09:53:38

Como parte de Spring 4.1.1 en adelante, ahora tiene soporte completo de Java 8 Optional (ticket original ) por lo tanto, en su ejemplo, ambas solicitudes irán a través de su punto final de asignación único, siempre y cuando reemplace required=false con Opcional para su 3 params logout, nombre, contraseña:

@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
Author: dimitrisli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-15 23:52:41

Cree 2 métodos que manejen los casos. Puede indicar a la anotación @RequestMapping que tenga en cuenta ciertos parámetros al asignar la solicitud. De esa manera se puede dividir bien esto en 2 métodos.

@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
Author: M. Deinum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-16 14:30:57