¿Es posible que un controlador Spring 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 "cerrar sesión".
Si defino dos controladores para manejar cada solicitud por separado, Spring se queja con la excepción "Ya hay un método de bean 'Controlador' ... mapeado".
java
spring
spring-mvc
luksmir
fuente
fuente
Respuestas:
Es necesario dar
required = false
aname
ypassword
parámetros de la petición así. Esto se debe a que, cuando proporciona solo ellogout
parámetro, en realidad esperaname
ypassword
, además de que todavía es obligatorio.Funcionó cuando acaba de dar
name
ypassword
porquelogout
no era un parámetro obligatorio gracias a querequired = false
ya se diologout
.fuente
Como parte en
Spring 4.1.1
adelante, ahora tiene soporte completo de Java 8Optional
( boleto original ), por lo tanto, en su ejemplo, ambas solicitudes irán a través de su punto final de mapeo único siempre que lo reemplacerequired=false
con Opcional para su cierre de sesión de 3 parámetros, nombre, contraseña:fuente
Crea 2 métodos que manejan los casos. Puede indicar a la
@RequestMapping
anotación que tenga en cuenta ciertos parámetros al asignar la solicitud. De esa manera, puedes dividir esto en 2 métodos.fuente
!myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.
tengo que probar.handleLogin
otra, dará una excepción que indica que no se puede encontrar la asignación.