2010-01-19 4 views
7

Creo que estoy un poco confundido sobre la anotación de la sesión en mvc de primavera.Objetos por defecto en la primavera 3 mvc SessionAttributes cuando la sesión expiró

tengo código como este (2 pasos forman la muestra, los datos del paso 1 por el usuario, paso 2 de direcciones)

@SessionAttributes({"user", "address"}) 
public class UserFormController { 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView show(ModelAndView mv){ 
     mv.addObject(new User()); 
     mv.addObject(new Address()); 
     mv.setViewName("user_add_page"); 
     return mv; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String processForm(User user, BindingResult result){ 
     new UserValidator().validate(user, result); 
     if(result.hasErrors()){ 
      return "user_add_page"; 
     }else{ 
      return "redirect:/user_form/user_add_address"; 
     } 

// ......... 
} 

Ahora si presento la página después de mi sesión expira me sale error

org .springframework.web.HttpSessionRequiredException: sesión atributo 'usuario' - no se encuentra en sesión

¿Cómo lo manejo? me gustaría tener 2 opciones

  1. i crear objetos vacíos si falta en la sesión y aceptar someterse
  2. i hacia adelante de nuevo a forma usuario con algún mensaje

Im todavía en las primeras etapas de la primavera de aprendizaje lo siento si es algo muy obvio, simplemente no puedo verlo.

ps. ¿Es esa la mejor manera de resolver este tipo de forma en spring mvc o recomendaría un enfoque diferente?

Respuesta

4

1.i crear objetos vacíos si falta en la sesión y aceptar someterse

Uso @ModelAttribute("user") método -annotated para proporcionar el valor por defecto

2.i hacia adelante de nuevo a forma usuario con algún mensaje

uso @ExceptionHandler(HttpSessionRequiredException.class) método -annotated

+0

Junto a eso agregue '@ ModelAttribute' al atributo' User' en el método 'processForm'. –

0

De acuerdo con Spring 3.0 reference manual, parece que @SessionAttributes está destinado a ser utilizado en un tipo que desea almacenar de forma transparente en la sesión, como un "Comando" o un objeto de formulario de respaldo. No creo que quieras almacenar un Controlador en sesión.

+0

hymmm ... No, no me refiero a almacenar controlador en sesión. Mi problema es que una vez que expira su sesión, sus objetos de usuario y dirección (datos que contienen los beans) son nulos. llegué alrededor de ella con \t @ExceptionHandler (HttpSessionRequiredException.class) \t pública ModelAndView HandleException() { \t \t ModelAndView mv = new ModelAndView ("redirigir:/user_form"); \t \t mv.addObject (new User()); \t \t mv.addObject (nueva dirección()); \t \t return mv; } pero no es exactamente lo que tenía en mente, esperaba una solución más limpia – Art79

+0

'@ SessionAttributes' es para configurar los objetos que desea almacenar en la sesión. No indica que el controlador esté vinculado a la sesión (para eso hay una anotación '@ Scope'). –

1

tratar de comprobar aquí:

http://forum.springsource.org/showthread.php?t=63001&highlight=HttpSessionRequiredException

@Controller 
@RequestMapping(value="/simple_form") 
@SessionAttributes("command") 
public class ChangeLoginController { 

    @ModelAttribute("command") 
    public MyCommand createCommand() { 
    return new MyCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String get() {  
     return "form_view"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@ModelAttribute("command") MyCommand command) { 
     doSomething(command); // execute business logic 
     return "form_view"; 
    } 
} 
Cuestiones relacionadas