2013-07-18 13 views
8

Ich verwende Spring 3.2.0 MVC. In diesem muss ich ein Objekt zur Sitzung speichern. Derzeit verwende ich HttpSession Set und Get-Attribut zum Speichern und Abrufen des Werts.Spring @SessionAttribute, wie das Sitzungsobjekt in demselben Controller abgerufen wird

Es gibt nur das String not Object zurück. Ich möchte @SessionAttribute verwenden, wenn ich versuchte, es das Objekt in der Sitzung setzt, aber ich konnte das Sitzungsobjekt

@RequestMapping(value = "/sample-login", method = RequestMethod.POST) 
    public String getLoginClient(HttpServletRequest request,ModelMap modelMap) { 
     String userName = request.getParameter("userName"); 
     String password = request.getParameter("password"); 
     User user = sample.createClient(userName, password); 
     modelMap.addAttribute("userObject", user); 
     return "user"; 
    } 


    @RequestMapping(value = "/user-byName", method = RequestMethod.GET) 
    public 
    @ResponseBody 
    String getUserByName(HttpServletRequest request,@ModelAttribute User user) { 

     String fas= user.toString(); 
     return fas; 
    } 

Beide Methoden sind in demselben Controller nicht abrufen. Wie würde ich das verwenden, um das Objekt abzurufen?

+0

Sie haben die Frage so formuliert, als ob Sie versuchen würden, '@ SessionAttribute' zu ​​verwenden, aber Ihr Code-Snippet enthält es nicht. Also, wie hast du es benutzt? – sjngm

+0

Ich habe '@SessionAttributes ("userObject") hinzugefügt 'ich habe dies in meinem Code verwendet – jackyesind

Antwort

29

@SessionAttributes Anmerkung wird auf der Ebene der Klassen verwendet:

  1. Mark ein Modell Attribut Http beibehalten werden soll nach Behandlungsmethoden
  2. Bestücken Sie Ihr Modell mit dem zuvor gespeicherten Objekt von Http ausgeführt werden, bevor Handler-Methoden werden ausgeführt - wenn einer existiert

So können Sie es neben Ihrer verwenden @ModelAttribute Anmerkung wie in diesem Beispiel:

@Controller 
@RequestMapping("/counter") 
@SessionAttributes("mycounter") 
public class CounterController { 

    // Checks if there's a model attribute 'mycounter', if not create a new one. 
    // Since 'mycounter' is labelled as session attribute it will be persisted to 
    // HttpSession 
    @RequestMapping(method = GET) 
    public String get(Model model) { 
    if(!model.containsAttribute("mycounter")) { 
     model.addAttribute("mycounter", new MyCounter(0)); 
    } 
    return "counter"; 
    } 

    // Obtain 'mycounter' object for this user's session and increment it 
    @RequestMapping(method = POST) 
    public String post(@ModelAttribute("mycounter") MyCounter myCounter) { 
    myCounter.increment(); 
    return "redirect:/counter"; 
    } 
} 

Vergessen Sie auch nicht gemeinsam noobie pitfall: stellen Sie sicher, Sie machen Ihre Sitzung serialisierbare Objekte.

+2

Kürzlich sah ich mich der gleichen Situation gegenüber - benötigt, um das Sitzungsattribut in meiner Handler-Methode abzurufen. Die Verwendung von @ModelAttribute ist aufgrund der Datenbindungsfunktion für Federn nicht die beste Lösung. Wenn Sie in Ihrem Beispiel eine Post-Anfrage erhalten, die einen Parameter mit einem Namen enthält, der einem der myCounter-Feldnamen entspricht, wird spring dieses Feld automatisch auf den aus dem Parameter erhaltenen Wert setzen, was eine völlige Überraschung sein kann. http://stackoverflow.com/questions/27744890/spring-mvc-how-to-forbid-data-binding-to-modelattribute – troy

Verwandte Themen