2010-01-19 5 views
7

Penso che mi sia confuso un po 'con l'annotazione della sessione in spring mvc.Oggetti predefiniti in primavera 3 mvc SessionAttributes in caso di sessione scaduta

Ho codice come questo (2 gradini modulo di esempio, i dati step 1 utente, step 2 indirizzo)

@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"; 
     } 

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

Ora, se mi presento pagina dopo la mia sessione scade ottengo errore

org .springframework.web.HttpSessionRequiredException: sessione attributo 'utente' necessaria - non trovato in sessione

Come lo gestisco? Mi piacerebbe avere 2 opzioni

  1. creo oggetti vuoti se mancante in sessione ed accettare presentare
  2. i successivo indietro modulo utente con qualche messaggio

Im ancora in fase iniziale di apprendimento Primavera mi dispiace se è qualcosa di molto ovvio, non posso vederlo.

ps. è che anche il buon modo di risolvere questo tipo di modulo in primavera in mvc o consiglieresti un approccio diverso?

risposta

4

1.I creare oggetti vuoti se mancante in sessione ed accettare presentare

Usa @ModelAttribute("user") metodo -annotated per fornire il valore di default

2.I avanti indietro al modulo utente con qualche messaggio

Usa @ExceptionHandler(HttpSessionRequiredException.class) metodo -annotated

+0

Accanto a tale aggiunta '@ ModelAttribute' all'attributo' User' nel metodo 'processForm'. –

0

In base allo Spring 3.0 reference manual, sembra che @SessionAttributes sia destinato a essere utilizzato su un tipo che si desidera archiviare in modo trasparente nella sessione, ad esempio un "Comando" o un oggetto di backup del modulo. Non penso che vorrai conservare un controller in sessione.

+0

hymmm ... no non ho intenzione di archiviare controllore in sessione. Il mio problema è che una volta scaduta la sessione, gli oggetti utente e indirizzo (i normali bean di mantenimento dei dati) sono nulli. ho preso in giro con \t @ExceptionHandler (HttpSessionRequiredException.class) \t pubblico ModelAndView HandleException() { \t \t ModelAndView mv = new ModelAndView ("redirect:/user_form"); \t \t mv.addObject (new User()); \t \t mv.addObject (new Address()); \t \t return mv; ma non è esattamente quello che avevo in mente, speravo in una soluzione più pulita – Art79

+0

'@ SessionAttributes' è per la configurazione degli oggetti che si desidera archiviare nella sessione. Non indica che il controller è associato alla sessione (per questo esiste un'annotazione '@ Scope'). –

1

tenta di controllare qui:

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"; 
    } 
}