es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

@ModelAttribute puede resultar confuso

Tengo una clase Controller que tiene funcionalidad de inicio de sesión. Cuando ingreso el nombre de usuario y la contraseña y presiono enviar, llamará a este controlador y almacenará la información del cliente en la sesión. Pero una cosa me confunde, es el @ModelAttribute.

@Controller
@SessionAttributes("customer")
public class LoginController {

    @Autowired
    CustomerService customService;

    @ModelAttribute("customer")
    public Customer getCustomer(@ModelAttribute Customer customer) {
        Customer c = customService.getCustomer(customer.getUsername(), customer.getPassword());

        return c;
    }

    @RequestMapping(method=RequestMethod.POST, value="/login")
    public String submitLoginForm(Model model) {

        return "redirect:/";
    }
}

Usaré @ModelAttribute Customer customer para almacenar el nombre de usuario y la contraseña que he ingresado, y usaré Customer c para almacenar toda la información que obtengo de customService y almacenarla en la sesión. Pero la sesión almacena el Customer customer en su lugar.

Si cambio el argumento así, funciona normalmente.

public Customer getCustomer(@RequestParam String username, @RequestParam String password) {
        Customer c = customService.getCustomer(username, password);

        return c;
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Explicación:

    En este fragmento de código, se utiliza la anotación @ModelAttribute para vincular los parámetros del método getCustomer() al atributo de modelo “customer”. Esto se hace automáticamente por Spring MVC cuando se invoca el controlador LoginController.

    La confusión surge porque el método getCustomer() en realidad está devolviendo un objeto Customer obtenido del CustomerService, pero también está vinculando los datos de entrada al atributo de modelo “customer”. Esto significa que el atributo de sesión “customer” está apuntando realmente a los datos de entrada, no al objeto Customer devuelto por el servicio.

    Para solucionar esto, puedes cambiar el argumento del método getCustomer() para utilizar anotaciones @RequestParam para los parámetros de nombre de usuario (username) y contraseña (password). De esta manera, el método ya no vinculará los datos de entrada al atributo de modelo “customer”, y el atributo de sesión almacenará el objeto Customer devuelto por el servicio.

Comments are closed.