2010-02-09 4 views
14

Ich möchte ein Domänenobjekt (UserVO) aus Sitzung Bereich lesen.Spring 3.0 setzen und erhalten Sitzungsattribut

ich die uservo in einem Controller setze genannt WelcomeController

@Controller 
@RequestMapping("/welcome.htm") 
public class WelcomeController { 
@RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ 
     User user = loginService.loginUser(loginCredentials); 
    session.setAttribute("user", user); 
     return "loginSuccess"; 
    } 
} 

Ich bin in der Lage, das Objekt in jsp Seiten <h1>${user.userDetails.firstName}</h1>

zu verwenden, aber ich bin nicht in der Lage, den Wert von einem anderen Controller zu lesen,

ich versuche, die Session-Attribut wie folgt lauten:

@Controller 
public class InspectionTypeController { 
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
public String addInspectionType(InspectionType inspectionType, HttpSession session) 
{ 
      User user = (User) session.getAttribute("user"); 
      System.out.println("User: "+ user.getUserDetails().getFirstName); 

     } 
} 
+0

Wie können Sie nicht? Was ist das genaue Problem – Bozho

+0

Ich habe das gleiche Problem für Sie jetzt. Hast du eine andere Lösung gefunden? –

Antwort

39

Der von Ihnen angezeigte Code sollte funktionieren - der HttpSession wird von den Controllern gemeinsam verwendet, und Sie verwenden denselben Attributnamen. Also geht etwas anderes schief, das du uns nicht zeigst.

Unabhängig davon, ob es funktioniert oder nicht, bietet Spring jedoch einen eleganteren Ansatz zum Beibehalten Ihrer Modellobjekte in der Sitzung unter Verwendung der @SessionAttribute Annotation (siehe docs).

Zum Beispiel (ich nicht getestet haben, aber es gibt Ihnen die Idee):

@Controller 
@RequestMapping("/welcome.htm") 
@SessionAttributes({"user"}) 
public class WelcomeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(ModelMap modelMap){ 
     User user = loginService.loginUser(loginCredentials); 
     modelMap.addtAttribute(user); 
     return "loginSuccess"; 
    } 
} 

und dann

@Controller 
@SessionAttributes({"user"}) 
public class InspectionTypeController { 

    @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
    public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { 
     System.out.println("User: "+ user.getUserDetails().getFirstName); 
    } 
} 

Allerdings, wenn Ihr Original-Code nicht funktioniert, dann Das wird auch nicht funktionieren, da mit Ihrer Sitzung etwas anderes nicht stimmt.

+1

Ich kam hier auf der Suche nach der ersten Lösung ('@ SessionAttributes') und alles, was ich bekam, war' java.lang.IllegalStateException: Kann keine Sitzung erstellen, nachdem die Antwort committed' –

+1

Dies scheint zu widersprechen, was @karpaczio sagt ... Kann jemand bestätigen, was richtig ist? Ich würde denken, dass Sitzungsattribute unabhängig von dem betreffenden '@ Controller 'geteilt werden, aber ich habe mich nicht mit den inneren Funktionen von' @ SessionAttribute' beschäftigt. – Andy

+2

@Andy Sehen Sie meinen Kommentar zu karpaczios Antwort –

6

@SessionAttributes funktioniert nur im Kontext eines bestimmten Handlers, daher ist das in WelcomeController festgelegte Attribut nur in diesem Controller sichtbar.

+5

Was Sie sagen, ist der Fall für Spring-Versionen <= 3.1.2.RELEASE. Ab 3.1.2.RELEASE werden @SessionAttributes wie erwartet zwischen verschiedenen Controllern beibehalten. –

+1

@Denis Kniazhev siehe [hier] (http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/ org/springframework/web/bind/Anmerkung/SessionAttributes.html) Verwenden Sie SessionAttributes für solche Konversationsattribute, die während der Konversation eines bestimmten Handlers vorübergehend in der Sitzung gespeichert werden sollen. Für permanente Sitzungsattribute, z.B. Für ein Benutzerauthentifizierungsobjekt verwenden Sie stattdessen die traditionelle session.setAttribute-Methode. – lolotron

2

Verwenden Sie eine Elternklasse, um alle Controller zu erben und SessionAttributes dort zu verwenden. Nur dass diese Klasse im Paket-Scan von mvc sein sollte.

0

Möglicherweise haben Sie Ihre UserVO nicht als serialisierbar festgelegt.

Verwandte Themen